javascript - 为什么 redux-sessionstorage 在恢复状态时不更新节点的属性?

标签 javascript reactjs redux session-storage

我使用 redux-sessionstorage 将我的应用状态的一个子集存储到 session 存储中。该状态的一部分表示 UI 中的某些面板是展开还是折叠(可见或隐藏)。

我有一个示例应用程序完全重现了这个:https://github.com/shawninder/sessionstorage-bug

有关完整的复制步骤,请参阅自述文件。

同时在线托管 here (给它一点时间解冻)

问题发生在我重新加载页面时。 redux-sessionstorage 正确地从 sessionstorage 恢复以前的状态并触发渲染,但我用来隐藏和显示的样式属性没有更新。

换句话说,这按预期工作:

<p>showNotice: {props.app.showNotice ? 'true' : 'false'}</p>

我可以看到 showNotice: false在页面加载时,但它立即被 showNotice: true 取代当 redux-sessionstorage 恢复保存的状态时。

但以下不起作用:

<div
  className='notice'
  style={{
    opacity: props.app.showNotice ? 1 : 0,
    transform: props.app.showNotice ? 'translateX(0)' : 'translateX(-100%)'
  }}
>
  Notice!
</div>

页面加载时隐藏了通知(正如预期的那样),但是当 redux-sessionstorage 恢复状态时它不会显示。事实上,直到我点击切换按钮两次,它才显示,第一次设置 showNotice返回false , 然后第二次将其设置为 true并显示 <div> .

为什么 redux-sessionstorage 没有更新 style属性,人们通常如何处理?

最佳答案

@lecstor 指出了有关此问题的正确线索。

这是服务器端渲染 (SSR) 的事情。 Dan Abramov 在此 comment 中描述的解决方法解决了问题。

您正在使用 Next.js 进行 SSR。在 dev 模式下运行项目时,在按 Toggle to true 并重新加载后,您可以在 Chrome 控制台上看到以下错误消息:

警告:文本内容不匹配。服务器:“假”客户端:“真”

由于 Next 对客户端保存的状态一无所知,它总是将 app.showNotice 返回到 false。您还可以在 Chrome 网络选项卡上查看 GET localhost 的返回内容。

显然 Next.js 试图合并从服务器返回的内容和本地呈现的内容,但未能合并样式。显然,这是 Next 和 React 16 SSR 上的预期行为,您可以通过触发第二个 render() 或执行下面的实现来克服。

class App extends Component {

  constructor(props) {
    super(props);
    this.state = { showNotice: false };
  }

  componentDidMount() {
    this.setState({ showNotice: this.props.app.showNotice });
  }

  componentWillReceiveProps(props) {
    this.setState({ showNotice: props.app.showNotice });
  }

  render() {
    return (
      <div>
        <p>showNotice: {this.state.showNotice ? 'true' : 'false'}</p>
        <button onClick={(event) => {
          this.props.dispatch({ type: 'App:toggleNotice' })
        }}>toggle</button>
        <div
          className='notice'
          style={{
            opacity: this.state.showNotice ? 1 : 0,
            transform: this.state.showNotice ? 'translateX(0)' : 'translateX(-100%)'
          }}
        >
          Notice!
        </div>
        <style jsx>{`
          .notice {
            width: 100px;
            transition-property: opacity, transform;
            transition-duration: 0.4s;
          }
        `}</style>
      </div>
    )
  }  
}

关于javascript - 为什么 redux-sessionstorage 在恢复状态时不更新节点的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55166186/

相关文章:

javascript - Bootstrap Accordion - 折叠时更改顶部面板的位置

javascript - 如何在使用 localtunnel 公开本地主机时发布请求

javascript - 使用 ReactJS + Redux 时是否需要 componentWillReceiveProps 和 ReplaceProps?

javascript - 错误: React Hook "useRouter" - nextJs/javascript app not building

javascript - Node.JS执行git命令错误: Permission denied (publickey)

javascript - 定义要作为参数传递的函数

javascript - 调用一个函数,在每次状态更改时触发服务调用

json - 在 ReactJs 中基于动态路径加载图像

javascript - 组件挂载时将 redux 状态移植到组件状态(不需要 GET 请求)

reactjs - 在拖放过程中,如果任何组件悬停在当前组件上,当前组件会更改其样式。这没有按预期发生吗?