Reactjs 使用两个useffect挂钩

Reactjs 使用两个useffect挂钩,reactjs,react-hooks,Reactjs,React Hooks,我试着用钩子做反应。我有这样一种状态: const [state, setState] = useState<State>({ titel: "", somethingElse: "", tabledata: [], }); 现在我有了行为,第二个useffect正在覆盖第一个useffect setState命令。 我的变量titel和somethingels总是空的 现在我可以通过以下方式改变我的状态: const [titel, setTitel] =

我试着用钩子做反应。我有这样一种状态:

const [state, setState] = useState<State>({
    titel: "",
    somethingElse: "",
    tabledata: [],
});
现在我有了行为,第二个useffect正在覆盖第一个useffect setState命令。 我的变量titel和somethingels总是空的

现在我可以通过以下方式改变我的状态:

const [titel, setTitel] = useState<>({
    titel = ""
});
const [somethingElse, setSomethingElse] = useState<>({
    somethingElse = ""
});
但这使整个过程变得不清楚,而且要一次性设置多个变量的状态并不像我们使用setState…state,titel=Hello,somethingElse=Else那样容易

还有其他可能性吗

第二个useeffect将覆盖第一个useeffect设置状态

useState函数不会自动合并状态。因此,您需要使用通过回调访问的前一个状态

useEffect(
  () => {
    const tabledata = ...
    setState(prevState => ({ // use previous state
      ...prevState,
      tabledata
    }))
  }, [props.taenzer]
)
还有其他可能性吗

你可以通过道具了解你的状态,移除第一个效果而不依赖它

const [{ title, somethingElse, tabledata }, setState] = useState<State>({
    ...props,
    tabledata: [],
});
第二个useeffect将覆盖第一个useeffect设置状态

useState函数不会自动合并状态。因此,您需要使用通过回调访问的前一个状态

useEffect(
  () => {
    const tabledata = ...
    setState(prevState => ({ // use previous state
      ...prevState,
      tabledata
    }))
  }, [props.taenzer]
)
还有其他可能性吗

你可以通过道具了解你的状态,移除第一个效果而不依赖它

const [{ title, somethingElse, tabledata }, setState] = useState<State>({
    ...props,
    tabledata: [],
});

第二个useffect覆盖第一个useffect setState命令是什么意思?我无法从示例中看出。Tbh,我喜欢第二种方法。因为钩子,我尽量跳过嵌套状态。使用这种方法,您可以以不变的方式非常轻松地操纵状态。如果我选择嵌套,我选择usereducer看起来像一个竞争条件。在装载过程中,您将获得两个正在执行的效果,并且顺序可能尚未确定,因此您将获得两个几乎同时执行的setState,最后一个将保持不变,但很可能两者都将读取相同的初始状态。您所说的第二个useffect是指覆盖第一个useffect setState命令?我无法从示例中看出。Tbh,我喜欢第二种方法。因为钩子,我尽量跳过嵌套状态。使用这种方法,您可以以不变的方式非常轻松地操纵状态。如果我选择嵌套,我选择usereducer看起来像一个竞争条件。在装载过程中,您将获得两个正在执行的效果,并且顺序可能尚未确定,因此您将获得两个几乎同时发生的设置状态,最后一个将保持不变,但很可能两个都将读取相同的初始状态。