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));