Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 父级的设置状态不触发组件将接收子级的道具_Javascript_Reactjs_React Native_State_React Props - Fatal编程技术网

Javascript 父级的设置状态不触发组件将接收子级的道具

Javascript 父级的设置状态不触发组件将接收子级的道具,javascript,reactjs,react-native,state,react-props,Javascript,Reactjs,React Native,State,React Props,我有一个组件父级和一个组件子级,其中一些道具连接到父级状态 在父级中,我调用setState,但子级的组件willreceiveprops函数未被激发。 更准确地说,它在父对象的某个点发射,而不是在另一个点发射 这是家长: ... imports class HomeScreen extends Component { constructor(props) { super(props); dispatchFbPermissionAction = th

我有一个组件父级和一个组件子级,其中一些道具连接到父级状态

在父级中,我调用setState,但子级的
组件willreceiveprops
函数未被激发。
更准确地说,它在父对象的某个点发射,而不是在另一个点发射

这是家长:

... imports

class HomeScreen extends Component {

    constructor(props) {
        super(props);

        dispatchFbPermissionAction = this.dispatchFbPermissionAction.bind(this);

        this.state = {
            fbPermissions: [],
        }
    }

    componentDidMount () {
        this._loadInitialState();
    }

    _responsePermissionsCallback(error: ?Object, result: ?Object) {
        if (error) {
            log('Error fetching data: ' + error.toString());
        } else {
            dispatchFbPermissionAction(result.data);
        }
    }

    dispatchFbPermissionAction = (data) => {
        // **NOT FIRED**
        this.setState({
            fbPermissions: data
        });

        this.props.fbPermissionsLoaded(data);
    }

    async _loadInitialState() {
        AccessToken.getCurrentAccessToken().then(
            (data) => {
                if (data) {
                    const infoRequest = new GraphRequest(
                      '/me/permissions',
                      null,
                      this._responsePermissionsCallback,
                    );
                    new GraphRequestManager().addRequest(infoRequest).start();

                    // **FIRED**
                    this.setState({
                        ...
                    });

                    this.props.loggedIn();
                }
            }
        );
    }

    render () {
        const { navigation } = this.props;

        return (
            <Container>
                <ScrollableTabView
                    <View tabLabel="ios-film" style={styles.tabView}>
                        <Text style={styles.tabTitle}>{_.toUpper(strings("main.theatres"))}</Text>
                        <ListTheatre navigation={this.props.navigation} filterText={this.state.filterText} isLoggedIn={this.state.isLoggedIn} fbPermissions={this.state.fbPermissions}></ListTheatre>
                    </View>
                </ScrollableTabView>
            </Container>
        )
    }
}

const mapStateToProps = (state) => {
    return {
        isLoggedIn: state.isLoggedIn,
        listTheatre: state.listTheatre,
        listMusic: state.listMusic
    };
};

// wraps dispatch to create nicer functions to call within our component
const mapDispatchToProps = (dispatch) => ({
    startup: () => dispatch(StartupActions.startup()),
    loggedIn: () => dispatch({
        type: LOGGED_IN
    }),
    fbPermissionsLoaded: (data) => dispatch({
        type: FB_PERMISSIONS_LOADED,
        fbPermissions: data
    })
});

export default connect(mapStateToProps, mapDispatchToProps)(HomeScreen)
。。。进口
类主屏幕扩展组件{
建造师(道具){
超级(道具);
dispatchFbPermissionAction=this.dispatchFbPermissionAction.bind(this);
此.state={
FBI权限:[],
}
}
组件安装(){
这是。_loadInitialState();
}
_responsePermissionsCallback(错误:?对象,结果:?对象){
如果(错误){
日志('获取数据时出错:'+Error.toString());
}否则{
dispatchFbPermissionAction(结果数据);
}
}
dispatchFbPermissionAction=(数据)=>{
//**未被解雇**
这是我的国家({
FBI权限:数据
});
此.props.fbPermissionsLoaded(数据);
}
异步_loadInitialState(){
AccessToken.getCurrentAccessToken()。然后(
(数据)=>{
如果(数据){
const infoRequest=新GraphRequest(
“/me/permissions”,
无效的
这是.\u responsePermissionsCallback,
);
新建GraphRequestManager().addRequest(infoRequest).start();
//**解雇**
这是我的国家({
...
});
this.props.loggedIn();
}
}
);
}
渲染(){
const{navigation}=this.props;
返回(
{
返回{
isLoggedIn:state.isLoggedIn,
listTheatre:state.listTheatre,
listMusic:state.listMusic
};
};
//包装分派以创建更好的函数,以便在我们的组件中调用
const mapDispatchToProps=(调度)=>({
启动:()=>调度(StartupActions.startup()),
loggedIn:()=>调度({
类型:已登录
}),
fbPermissionsLoaded:(数据)=>调度({
类型:FB\u权限\u已加载,
FBI权限:数据
})
});
导出默认连接(mapStateToProps、mapDispatchToProps)(主屏幕)
这是孩子:

... imports

class ListTheatre extends Component {

    constructor(props) {
        super(props);

        this.state = {
            ...
        }
    }

    componentWillReceiveProps(nextProps) {
        log(this.props)
    }

    shouldComponentUpdate(nextProps, nextState) {
        return !nextState.fetching;
    }

    render() {
        const { navigate } = this.props.navigation;

        return (
            <SectionList
                ...
            />
        )
    }
}

ListTheatre.propTypes = {
    isLoggedIn: PropTypes.bool.isRequired,
}

const mapStateToProps = (state) => {
    return {
        isLoggedIn: state.isLoggedIn
    };
};

const mapDispatchToProps = (dispatch) => ({
    startup: () => dispatch(StartupActions.startup())
});

export default connect(mapStateToProps, mapDispatchToProps)(ListTheatre);
…导入
类ListTheatre扩展组件{
建造师(道具){
超级(道具);
此.state={
...
}
}
组件将接收道具(下一步){
日志(this.props)
}
shouldComponentUpdate(下一步,下一步状态){
return!nextState.fetching;
}
render(){
const{navigate}=this.props.navigation;
返回(
)
}
}
ListTheatre.propTypes={
isLoggedIn:PropTypes.bool.isRequired,
}
常量mapStateToProps=(状态)=>{
返回{
isLoggedIn:state.isLoggedIn
};
};
const mapDispatchToProps=(调度)=>({
启动:()=>调度(StartupActions.startup())
});
导出默认连接(mapStateToProps、mapDispatchToProps)(ListTheatre);

我不知道为什么调用
GraphRequestManager().addRequest
后的setState像一个符咒一样工作(启动子对象的componentWillReceiveProps函数),而dispatchFbPermissionAction函数中的setState不会触发子组件的componentWillReceiveProps函数。

这是由于
连接
/
连接(ListTheatre)
封装了ListTheatre组件实现的sCU(应更新组件)在内部对于您,通过设置“连接到false”的纯选项将其关闭

导出默认连接(mapStateToProps,mapDispatchToProps,null,{pure:false})(ListTheatre)

[纯](布尔):如果为true,则connect()将避免重新呈现和调用mapStateToProps、mapDispatchToProps和mergeProps,前提是相关的state/props对象根据其各自的相等性检查保持相等。假定包装的组件为“纯”组件,不依赖于其道具和选定Redux存储的状态以外的任何输入或状态。默认值:true