繁体   English   中英

React Hooks useState() 与数组 Object

[英]React Hooks useState() with an Array of Object

当我创建新的“Todo”并修改字段时没有问题,我的问题是当我单击“显示所有对象”按钮时接收回子数据。

这是一个代码示例来说明我的问题:

const CompoOne = () =>{
  const [todos, setTodos] = useState([])
  const [subject, setSubject] = useState("")
  const [priority, setPriority] = useState("")

  const addTodo = () => setTodos(
     [...todos, { a: "Title", b: "subTitle", c: "content"}]
  )

  return (
        <>
          <InputText
            value={subject}
            setValue={setSubject}
            label="subject field"
          />
          <InputText
            value={priority}
            setValue={setPriority}
            label="priority field"
          />
          <hr />
          <h2>Todo:</h2>
          <hr />
          <button
            onClick={()=>addTodo()}
          >
            add a todo
          </button>
          <>
            {setTodos.map((el,i)=>(
                <CompoTwo
                  todo={el}
                  setTodos={setTodos}
                  todos={todos}
                  key={i}
                />
            )}
          </>

          <button
            onClick={()=>console.log(todos)}
          >
            show all objects
          </button>
        </>
  )
}


const compoTwo = ({ todo, todos, setTodos }) =>{
  const [a, setA] = useState("")
  const [b, setB] = useState("")
  const [c, setC] = useState("")

  const handleChange = (e) =>{
    const {name, value} = e.target
    setTodos((prevState)=>{
      //I would like to update the inside the prevState instance
      const updatedArray = // something like [...prevState, [name]:value]
      // return updatedArray
    })
  }

  return(
    <>
          <InputText
            value={a}
            name="a"
            onChange={(e)=>setA(e.target.value)}
            onBlur={(e) => handleChange(e)}
            label="field A"
          />
          <InputText
            value={b}
            name="b"
            onChange={(e)=>setB(e.target.value)}
            onBlur={(e) => handleChange(e)}
            label="field B"
          />
          <InputText
            value={c}
            name="c"
            onChange={(e)=>setC(e.target.value)}
            onBlur={(e) => handleChange(e)}
            label="field C"
          />
    </>
  )
}

如果我在“添加待办事项”按钮上单击两次并更改其中一个字段的值,我仍将获得默认值

[
  {a: "Title", b: "subTitle", c:"content"},
  {a: "Title", b: "subTitle", c:"content"},
]

我的目的是获取子组件的更新值。

如果你有什么想法...

这是尝试播放的代码沙箱链接

提前致谢

我认为你在为 UseState 和 SetTodos 设置初始值时有问题,你可以参考下面的代码:

const [todos, setTodos] = useState([
{ a: 'Title', b: 'subTitle', c: 'content' },
{ a: 'Title', b: 'subTitle', c: 'content' }
]);
const addTodo = (todo) => {
 setTodos([...todos, todo]);
};

你可以试试这个,希望它能对你的compoTwo有所帮助。

注意:你也可以将 todo 属性值设置为 useState 的初始值。

const compoTwo = ({ todo, todos, setTodos }) =>{
  const [a, setA] = useState("")
  const [b, setB] = useState("")
  const [c, setC] = useState("")

  const handleChange = (e) => {
    const { name, value } = e.target;
    setTodos((prevState) => {
      const temp = [...prevState];
      const find = temp.find((res) => res.id === todo.id);
      if (find) {
        find[name] = value;
        return temp;
      } else {
        return prevState;
      }
    });
  };

  return(
    <>
          <InputText
            value={a}
            name="a"
            onChange={(e)=>setA(e.target.value)}
            onBlur={(e) => handleChange(e)}
            label="field A"
          />
          <InputText
            value={b}
            name="b"
            onChange={(e)=>setB(e.target.value)}
            onBlur={(e) => handleChange(e)}
            label="field B"
          />
          <InputText
            value={c}
            name="c"
            onChange={(e)=>setC(e.target.value)}
            onBlur={(e) => handleChange(e)}
            label="field C"
          />
    </>
  )
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM