0

你能告诉我如何在反应中动态添加项目吗?

我收到来自服务器的响应(名称、标签等)。例如,我只是模拟了我的响应,两秒钟后我获取了它。

在我的示例中,我有两个选择框或下拉菜单。第一个下拉菜单的值是“one”和“two”(在 json 中作为选项给出)。

在 json 中还有一个选项dependentField ,这意味着该字段依赖于另一个字段(提到的值是依赖的)。在我的示例second中,字段依赖于第一个字段。

因此,第二个选择或下拉字段的值将是["three", "four"]第一个选择框或下拉值 id one

因此,第二个选择或下拉字段的值将是["five", "six"]第一个选择框或下拉值 id two

所以我需要watch提到字段的值hook form

https://react-hook-form.com/get-started

我们可以动态添加选项吗

这是代码

https://codesandbox.io/s/stoic-benz-lxb8i

useEffect(() => {
    console.log("====");
    (async () => {
      var a = await FETCH_API();
      console.log("sssss");
      setState(a);
      console.log(a);
    })();
  }, []);


const getForm = () => {
    try {
      return state.map((i, index) => {
        switch (i.type) {
          case "text":
            return (
              <div key={index}>
                <label>{i.label}</label>
                <input type="text" ref={register()} name={i.name} />
              </div>
            );

          case "select":
            if (i.watch) {
              watch(i.name, null);
            }
            return (
              <div key={index}>
                <label>{i.label}</label>
                <select name={i.name} ref={register()}>
                  {i.options.map((i, idx) => {
                    return (
                      <option key={idx} value={i}>
                        {i}
                      </option>
                    );
                  })}
                  /
                </select>
              </div>
            );
          default:
            return <div>ddd</div>;
        }
      });
      return <div>ddd</div>;
    } catch (e) {}
  };

我不想做任何 harcoading 之类的

useEffect(()=>{


},[‘first’]) 

我们可以动态观察或添加useeffect来动态观察变化吗?

任何更新

4

1 回答 1

2

这是一个简单的两个选择。第一个选择取决于第二个

import React,{useState, useEffect} from "react"

const App = () => {

  const [state,setState] = useState({
    option1:["one","two"],
    option2: []
  })

  useEffect(()=> {
    (async () => {
      var a = await FETCH_API();
      console.log("sssss");
      setState({
        ...state,
        option2: a
      });
      console.log(a);
    })();
  },[state.option1])

  return(
    <div>
      <select>
        {
          state.option1.map((i,idx)=>{
            return(
              <option key={idx} value={i}>
              {i}
              </option>
            )
          })
        }

      </select>
      <select>
        {
          state.option2.map((i,idx)=>{
            return(
              <option key={idx} value={i}>
              {i}
              </option>
            )
          })
        }

      </select>
    </div>
  )
}

export default App
于 2020-02-17T11:58:57.353 回答