【问题标题】:Passing changed state to props and props are not updated将更改的状态传递给道具并且道具不会更新
【发布时间】:2020-10-23 21:20:09
【问题描述】:

我在通过 react-router-dom 元素 NavLink 传递更新状态时遇到问题。

这是组件1的示例代码:

...
this.state = {
   toggle: true;
}

this.handleClick = () => {
    this.setState(prevState => {toggle: !prevState.toggle});
}

...

render() {
    { toggle } = this.state;
    return (
        <div>{toggle}</div>
        <NavLink to={{pathname: "component2path", toggle}}>
            <div role="presentation" onClick={this.handleClick}>click</div>
        </NavLink>
    );
}

所以点击后我可以看到切换真/假的 div 变化。

这是组件2的示例代码:

ComponentDidUpdate(prevProps,prevState) {
    { toggle } = this.props.location;
    { toggleOld } = prevProps.location;
    
    console.log(toggle,toggleOld); //this never change

    //i want to achieve this
    if(toggle === toggleOld) {
       doAction(); //do something;
    }
}

问题是我似乎无法在道具中反映状态变化。

有人可以帮忙吗?我有点坚持这个太久了。

【问题讨论】:

  • 你只是想通过路由推送发送一些状态到新路径吗?
  • 是的,这就是我发现的,道具是如何通过 react-router-dom navLink 发送的

标签: reactjs react-router-dom


【解决方案1】:

Linkto 道具对象形式仅接受 4 个属性:pathnamesearchhashstate

Link

<NavLink
  to={{
    pathname: "component2path", 
    state: {
      toggle, // <-- pack value into state object
    },
  }}
>
  <div role="presentation" onClick={this.handleClick}>click</div>
</NavLink>

props.location.state中提取它们

ComponentDidUpdate(prevProps,prevState) {
    { toggle } = this.props.location.state;
    { toggleOld } = prevProps.location.state;
    
    console.log(toggle,toggleOld); //this never change

    //i want to achieve this
    if(toggle === toggleOld) {
       doAction(); //do something;
    }
}

【讨论】:

  • 感谢尝试,但实际上它仍然传递错误。它不是反映状态。单击第一个 div 后,我可以看到 true。但是在 prevProps 和 props 中仍然是 false。
  • @MartinFric 最初的state.toggle 值不是真,所以接收假是正确的?还是您的场景不像您的 sn-ps 中所描述的那样?当导航到新路径时,组件 1 是否仍然挂载以更新状态?
  • 是的,实际上是菜单。它会在所有应用程序存在时都挂载
  • 对不起...我的意思是在 prevprops 和 props 中是真的...我只是疯了
  • @MartinFric 不用担心。好的,所以问题可能是反应状态更新和导航到新路径之间的顺序问题。我的猜测是 VDOM 上的事件传播将状态更新放在事件队列中,而导航是同步调用。我认为您的代码在具有正确更新的状态值之前导航。快速解决方法是简单地在路由状态中转发您期望的下一个状态,即{ pathname: '...', state: { toggle: !toggle } }
猜你喜欢
  • 1970-01-01
  • 2019-05-13
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
相关资源
最近更新 更多