【问题标题】:ReactJS componentWillReceiveProps not triggeringReactJS componentWillReceiveProps 未触发
【发布时间】:2018-03-23 05:02:05
【问题描述】:

我正在实现https://github.com/akiran/react-slick 的滑块

我有自定义子组件需要在父组件更新时更新其状态。当我正常加载幻灯片时,例如:

<Slider ref={c => this.slider = c } {...settings}>
  <div key={1}>
    <Slide1 key={1} formData={this.state.formData} />
  </div>
  ...
</Slider>

componentWillReceiveProps 工作正常。但是,当我根据示例 here 动态加载幻灯片时,这些生命周期事件永远不会被调用,即使在父级中更新了状态之后也是如此。

componentDidMount() {
    this.setState({
        slides: [
            <div key={1}>
                <Slide1 key={1} formData={this.state.formData} />
            </div>,
            ....
        ]
    )};
}


<Slider ref={c => this.slider = c } {...settings}>
  {this.state.slides.map(function (slide, i) {
    return slide
  })}
</Slide>

通过像这样加载组件,componentWillReceiveProps 永远不会被调用,即使在状态更新后也是如此。

我错过了什么?我不需要 Redux 来管理它吗?

【问题讨论】:

    标签: javascript reactjs slick.js


    【解决方案1】:

    首先,尝试在状态中存储实际的 React 元素是一个非常糟糕的主意,你应该只存储纯数据,然后在 render 方法中使用这些数据来组成标记。

    其次,componentWillReceiveProps 在您的情况下没有被调用,因为您的 Slide1 是第一次在那里渲染,它们被安装到 DOM 上,但 componentWillReceiveProps 只能为已安装的组件调用,请参阅@ 987654321@.

    【讨论】:

    • 谢谢丹。仍然是新的反应,但是将 jsx 存储在 state 中感觉不对。如果我有多个需要在幻灯片中呈现的自定义组件,还有其他方法可以解决即将发生的github.com/akiran/react-slick/blob/master/examples/… 吗?例如:Slide1、Slide2 等?
    • 这取决于那些 Slide1、Slide2... 是否彼此相似。根据名称和您在 Slider 中使用它们的事实,我敢打赌它们是。忘记幻灯片 1、2、3,只创建一张足够通用的幻灯片。
    • 它们实际上是完全不同的形式。不幸的是,真的没有共同点。
    • 这很难相信,因为命名。无论如何,如果它们差异很大,它们的渲染要么不应该像将它们从某个数组映射到完全不同的元素那样动态,要么创建通用渲染机制(理想情况下是组件)。如果你不想,提供你的通过 CodePen 之类的代码,否则我不能告诉你更多除了一般短语。
    • 您的第一条评论实际上非常有帮助。我在文档中读了 100 次,但由于某种原因,直到我在这里读到它才点击。我想我已经通过在数组中传递幻灯片名称列表而不是 jsx 元素来解决它。然后在.map 中,我只是检查它是哪张幻灯片并将其渲染到屏幕上。我不认为这是最优雅的解决方案,但它是一个非常独特的用例,而且时间不多了。非常感谢您的帮助。谢谢!
    猜你喜欢
    • 2017-03-12
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 2017-10-06
    相关资源
    最近更新 更多