ReactJS SetState没有重新渲染

imp*_*335 7 javascript reactjs fluxible

我有:

JobScreen

handleSetView(mode, e) {
        this.setState({
            view: mode
        });
        console.log(this.state.view)
    }

    render() {
        return (

            <div className="jobs-screen">
                <div className="col-xs-12 col-sm-10 job-list"><JobList view={this.state.view} /></div>
                <div className="col-xs-12 col-sm-2 panel-container">
                    <div className="right-panel pull-right"><RightPanel handleSetView={this.handleSetView} /></div>
...
)
}
Run Code Online (Sandbox Code Playgroud)

RightPanel

render() {
        return (
            <div>
                <div className="controls">
                    <span className="title">Views <img src="images\ajax-loader-bar.gif" width="24" id="loader" className={this.state.loading ? "pull-right fadeIn" : "pull-right fadeOut"}/></span>
                    <button onClick={this.props.handleSetView.bind(this, 'expanded')}><img src="/images/icons/32px/libreoffice.png" /></button>
                    <button onClick={this.props.handleSetView.bind(this, 'condensed')}><img src="/images/icons/32px/stack.png" /></button>
                    </div>
...
)}
Run Code Online (Sandbox Code Playgroud)

招贤纳才

render() {
        var jobs = [];
        this.state.jobs.forEach((job) => {
            jobs.push(
                <Job key={job.id} job={job} view={this.props.view} loading={this.state.loading} toggleTraderModal={this.props.toggleTraderModal} toggleOFTModal={this.props.toggleOFTModal}/>
            );
        });

        return (
            <div>
                {jobs}
            </div>
        );
    };
Run Code Online (Sandbox Code Playgroud)

问题是,视图状态的改变不会重新渲染任何子元素.

我怎样才能让它发挥作用?

Tom*_*ich 6

不确定它是否是您问题的核心,但是:

handleSetView={this.handleSetView}
Run Code Online (Sandbox Code Playgroud)

是错的,因为js如何绑定它.使用:

handleSetView={this.handleSetView.bind(this)}
Run Code Online (Sandbox Code Playgroud)

代替.

也,

this.setState({
  view: mode
});
console.log(this.state.view)
Run Code Online (Sandbox Code Playgroud)

看起来很奇怪 请注意,this.state在您调用后不会立即修改setState,React调度计划的setState操作可能需要一些时间.把它console.log放到渲染中以查看它实际被调用的时间.

最后,请确保您的组件没有实现shouldComponentUpdate生命周期方法(您可能没有明确地执行此操作,但如果您的组件扩展了除React.Component之外的某个类,则可能会发生这种情况)

  • 天才:)我错过了.bind(this)。那到底有什么作用呢? (2认同)
  • @Thomas Kulich 我确信这只是一个愚蠢的错误,但你说这在 js 中不会自动发生,我认为你的意思是在 ES2015 中。 (2认同)
  • 这不是处理此问题的最佳方法,因为每次重新渲染时都会创建一个新函数。最好在构造函数中绑定`this.handleSetView` 或者转换成es6箭头函数。 (2认同)