reactjs - useSelector 钩子(Hook)和重新渲染

标签 reactjs react-hooks

--编辑--我创建了一个codesandbox:https://codesandbox.io/s/xenodochial-hofstadter-d3jjo

我开始摸不着头脑,希望得到一些帮助 - 我认为 - 一个简单的问题。

我有一个基本的应用程序组件,可以呈现受控的文本输入。一旦您提交此输入,它就会在后端创建一条消息,该消息会更新 redux 存储。这部分似乎一切正常。

我的问题是当我尝试添加 useEffect Hook 以在添加新消息后重置输入值时。我注意到依赖于 [messages]useEffect 会在每次渲染时调用,而不是仅在 messages 更改时调用。输入输入的简单行为(这会导致每个字符重新渲染)都会触发钩子(Hook),即使它仍然是相同的值:一个空数组。

基本上我注意到,只有当我的 useSelector 返回相同的数组实例时,它才能按预期工作。因此,如果我只读取 state.messages.allIds 它将起作用,因为数组不会更改。但只需添加 .map(x => x) 即可使其每次返回一个新实例。 我添加了react-redux的shallowEqual来尝试解决这个问题,但没有成功,我不明白为什么它不能解决我的问题。

const App = () => {
  const [message, setMessage] = useState('');
  const messages = useSelector(
    (state: RootState) => (
      state.messages.allIds.map((id: string) => state.messages.byId[id])
    ),
    shallowEqual,
  );

  useEffect(() => {
    console.log('useEffect');
  }, [messages]);

  // ...

  return (
    <form onSubmit={/* ... */}>
      <input
        onChange={event => setMessage(event.target.value)}
        value={message}
      />
    </form>
  );
}

最佳答案

这可能来得很晚。但这可能会让面临同样问题的其他人受益。

如果您不希望函数在状态更改时重新渲染,而只想提取 redux 状态变量的值,则可以使用 useState

const state = useState();
const yourVariable = state.getState().reduxStateVariable;

关于reactjs - useSelector 钩子(Hook)和重新渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60707907/

相关文章:

javascript - useReducer 可以使用状态数组吗?

javascript - 如何从 useEffect 访问组件的当前状态而不使其成为依赖项?

reactjs - 即使我没有在 React 中单击“加载更多”,也要保持数据添加

javascript - 如何通过钩子(Hook)更新 react 中的对象状态

javascript - 如何在每次渲染之前重置 UseEffect React Hooks 中的数据?

reactjs - 如何解决我的搜索组件中的错误? react + Firebase

javascript - 将项目添加到状态内的数组时,渲染 React 应用程序不适用

reactjs - react : incorrect examples of calling Hooks inside loops and nested functions

python - 从 Flask 运行 NPM 构建

javascript - 未捕获错误 : A cross-origin error was thrown. React 无法访问开发中的实际错误对象