Reactjs 为什么我的连接状态没有';当我从componentWillMount()调用操作时,是否更新?
我的问题是,我有一个容器,它以前加载过并再次装入,但在通过Reactjs 为什么我的连接状态没有';当我从componentWillMount()调用操作时,是否更新?,reactjs,redux,react-redux,Reactjs,Redux,React Redux,我的问题是,我有一个容器,它以前加载过并再次装入,但在通过componentWillMount()的操作更新状态后,它不会更新其连接状态 这里是容器中的代码(您可以获得所有完整代码): /[…] 接口参数{ 方法:“自定义”|“自保存”; 目标:字符串; } 接口道具扩展了RouteComponentProps{ 国家:国家; 行动:行动类型; } 接口容器状态{ isActionBarSticky:布尔值; } 类容器扩展了React.Component{ 私钥:布尔; 建造师(道具:道具){
componentWillMount()
的操作更新状态后,它不会更新其连接状态
这里是容器中的代码(您可以获得所有完整代码):
/[…]
接口参数{
方法:“自定义”|“自保存”;
目标:字符串;
}
接口道具扩展了RouteComponentProps{
国家:国家;
行动:行动类型;
}
接口容器状态{
isActionBarSticky:布尔值;
}
类容器扩展了React.Component{
私钥:布尔;
建造师(道具:道具){
超级(道具);
此.state={
伊莎莉:是的,
};
// [...]
}
公共组件willmount(){
开关(this.props.match.params.method){
案例“来自定义”:
this.props.actions.setQuoteFromDefinitionName(this.props.match.params.target);
打破
案例“来自已保存”:
this.props.actions.setQuoteFromSavedQuoteTitle(this.props.match.params.target);
打破
}
}
// [...]
公共渲染(){
// [...]
if(this.props.state.quote){
loadedQuote=this.props.state.quote.sections.map((s)=>{
返回(
// [...]
);
});
// [...]
}
返回(
{loadedQuote}
{actionBar}
);
}
// [...]
}
常量mapStateToProps=(状态:state)=>({
国家,,
});
const mapDispatchToProps=(调度:调度)=>({
操作:bindActionCreators(操作、调度)
});
export const QuoteContainer=withRouter(连接(mapStateToProps,mapDispatchToProps)(容器));
所以之前已经加载了容器,我再次访问了相同的页面,所以它再次被装载<代码>this.props.actions.setQuoteFromDefinitionName(this.props.match.params.target)代码>被调用
正如我在Redux开发工具中看到的,它正确地更新了状态
容器按预期在
componentWillMount()
之后呈现,但是this.props.state.quote中的状态不会更新。为什么会发生这种情况?来自react docs:componentWillMount()在装载发生之前立即被调用。它在render()之前调用,因此在此方法中同步调用setState()不会触发额外的渲染。通常,我们建议改为使用构造函数()
避免在这种方法中引入任何副作用或订阅。对于这些用例,请改用componentDidMount()
这是在服务器呈现上调用的唯一生命周期挂钩。来自react docs:componentWillMount()在装载发生之前立即调用。它在render()之前调用,因此在此方法中同步调用setState()不会触发额外的渲染。通常,我们建议改为使用构造函数()
避免在这种方法中引入任何副作用或订阅。对于这些用例,请改用componentDidMount()
这是唯一一个在服务器渲染时调用的生命周期挂钩
// [...]
interface Params {
method: 'from-definition'|'from-saved';
target: string;
}
interface Props extends RouteComponentProps<Params> {
state: State;
actions: typeof Actions;
}
interface ContainerState {
isActionBarSticky: boolean;
}
class Container extends React.Component<Props, ContainerState> {
private isTicking: boolean;
constructor(props: Props) {
super(props);
this.state = {
isActionBarSticky: true,
};
// [...]
}
public componentWillMount() {
switch (this.props.match.params.method) {
case 'from-definition':
this.props.actions.setQuoteFromDefinitionName(this.props.match.params.target);
break;
case 'from-saved':
this.props.actions.setQuoteFromSavedQuoteTitle(this.props.match.params.target);
break;
}
}
// [...]
public render() {
// [...]
if (this.props.state.quote) {
loadedQuote = this.props.state.quote.sections.map((s) => {
return (
// [...]
);
});
// [...]
}
return (
<Wrapper style={this.state.isActionBarSticky ? {paddingBottom: '56px'} : undefined}>
{loadedQuote}
{actionBar}
</Wrapper>
);
}
// [...]
}
const mapStateToProps = (state: State) => ({
state,
});
const mapDispatchToProps = (dispatch: Dispatch<State>) => ({
actions: bindActionCreators<typeof Actions>(Actions, dispatch)
});
export const QuoteContainer = withRouter(connect(mapStateToProps, mapDispatchToProps)(Container));