【问题标题】:React custom hooks value is not changedReact 自定义钩子值没有改变
【发布时间】:2020-08-13 02:39:13
【问题描述】:

我有以下使用钩子的简单反应页面

https://codesandbox.io/embed/funny-resonance-2ijv4?fontsize=14&hidenavigation=1&theme=dark

我将选定的值提取到一个单独的组件中,以便其他组件可以访问它。在 Header 组件中,一旦用户单击 ListGroup.Item,更新的值实际上会更新,但它会更新两次。我不知道为什么。

其次,App 组件中的值不会更新。 我怎么了?

【问题讨论】:

    标签: reactjs react-hooks


    【解决方案1】:

    在 Header 组件中,一旦用户单击 ListGroup.Item,更新的值实际上会更新,但它会更新两次。我不知道为什么。

    将您的 console.log(selectedView); 放入效果中,然后重试。

    App 组件中的值未更新。我怎么了?

    每个组件也有自己的 useView 钩子副本,它没有任何“全局”状态。

    您可以在 Header 组件上公开一个 onViewChange 处理程序属性,并使用效果来处理当前选定视图的回调。

    const Header = ({ onViewChange }) => {
      const [selectedView, setSelectedView] = useView();
    
      useEffect(() => {
        onViewChange(selectedView);
      }, [onViewChange, selectedView]);
      ...
    

    App添加一些状态并保存回调视图值

    function App() {
      const [selectedView, setSelectedView] = useState();
    
      useEffect(() => {
        // place console.log in effect so only logs once per update
        console.log(selectedView);
      }, [selectedView])
    
      return (
        <div className="App">
          <Container>
            <Row>
              <Col>
                <Logo />
                <Header onViewChange={setSelectedView} />
                {selectedView === VIEW.clients && <ClientsView />}
                {selectedView === VIEW.categories && <CategoriesView />}
              </Col>
            </Row>
          </Container>
        </div>
      );
    }
    

    【讨论】:

    • 我在return语句之前的效果外添加了一个console.log,它打印了两次。
    • 所以对于全局状态我必须创建一个上下文,是吗?这是一种常见的模式吗?
    • @ArmenB 是的。许多应用程序状态管理库都是使用上下文系统构建的,但在最简单的层面上,你有一个具有一定价值的上下文提供者,以及反应树下任何地方的消费者。 React 甚至有一个 useContext 钩子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2020-08-27
    • 2020-11-02
    • 2020-08-09
    • 1970-01-01
    • 2022-12-08
    • 2020-12-05
    相关资源
    最近更新 更多