【发布时间】:2016-04-15 09:43:03
【问题描述】:
我正在使用 react & redux 开发应用程序,我需要 setProps,但它已被弃用。
看看下面的错误:
警告:不推荐使用 setProps(...) 和 replaceProps(...)。反而, 在顶层再次调用 render。
Uncaught Invariant Violation: setProps(...): You call
setPropson 有父组件的组件。这是一种反模式,因为道具会 渲染时得到响应式更新。相反,更改所有者的render方法将正确的值作为道具传递给组件 它是在哪里创建的。
那么我该如何设置道具呢?基本上是管理一些标签,看看下面我的代码:
export default React.createClass({
render: function() {
return (
<div className="demo-tabs">
<Tabs activeTab={this.props.activeTab}
onChange={(tabId) => this.setProps({ activeTab: tabId })} ripple>
<Tab>Stack</Tab>
<Tab>GitHub</Tab>
<Tab>Twitter</Tab>
</Tabs>
<section>
<div className="content">Content for the tab: {this.props.activeTab}</div>
</section>
</div>
);
}
});
容器
import React from 'react';
import TimeLine from './timeline';
import { connect } from 'react-redux';
import { getStackoverflow } from 'api/timeline';
const TimeLineContainer = React.createClass({
componentWillMount: function() {
getStackoverflow();
},
render: function() {
return (
<TimeLine {...this.props} />
)
}
});
const stateToProps = function(state) {
return {
timeline: state.timelineReducer.timeline
}
}
const dispatchToProps = function(dispatch) {
return {
onClick: () => {console.log('timeline was clicked')}
}
}
export default connect(stateToProps, dispatchToProps)(TimeLineContainer)
减速器
var timelineInitialState = {
github: [],
gist: [],
stackoverflow: [],
twitter: [],
activeTab: 2
}
export default function(state = timelineInitialState, action) {
switch (action.type) {
case 'GET_GITHUB':
//TODO: implement.
break;
case 'GET_GIST':
//TODO: implement.
break;
case 'GET_STACKOVERFLOW':
var stackoverflowState = Object.assign({}, state)
stackoverflowState.stackoverflow = action.stackoverflow;
return stackoverflowState;
break;
case 'GET_TWITTER':
//TODO: implement.
break;
default:
return state;
}
}
【问题讨论】:
-
听起来你需要自己设置的道具应该是内部状态,你应该调用 setState 。或者保留道具,但让它在它改变时设置状态(同步道具和状态)
-
就像@JuanMendes 所说,你会想要使用状态。你可以做的是使用你的道具设置你的初始状态,然后将更新后的值设置为状态
-
@realseanp 你必须确保你实现了
componentWillReceiveProps,所以当父组件在初始渲染后设置一个道具时它会更新状态
标签: javascript reactjs redux