Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.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 Reactjs嵌套状态和子组件_Javascript_Reactjs_Immutable.js - Fatal编程技术网

Javascript Reactjs嵌套状态和子组件

Javascript Reactjs嵌套状态和子组件,javascript,reactjs,immutable.js,Javascript,Reactjs,Immutable.js,我在具有许多嵌套数据和状态的大型应用程序中使用React/ImmutableJS。一些“嵌套”数据通过道具传递给子组件 子组件处理类似于局部变量的prop(由于prop是不可变的,所以没有变异):它们将一个新副本返回给父组件,父组件将更新自己的状态 一个简单的例子: const user = Immutable.Map({ name: '...', accessRights: Immutable.Map({ preferences: true, c

我在具有许多嵌套数据和状态的大型应用程序中使用React/ImmutableJS。一些“嵌套”数据通过道具传递给子组件

子组件处理类似于局部变量的prop(由于prop是不可变的,所以没有变异):它们将一个新副本返回给父组件,父组件将更新自己的状态

一个简单的例子:

const user = Immutable.Map({
    name: '...',
    accessRights: Immutable.Map({
        preferences: true,
        contact: false,
       ....
    })
});

class Admin extends Component {
    state = { user };

    render() {
        return <AccessRights
            rights={user.get('accessRights')}
            onRightsChange={newRights =>
                this.setState({ user: user.set('accessRights', newRights) })
            }
        />
    }
}

class AccessRights extends Component {
    render() {
        const { rights, onRightsChange } = this.props;

        return <div>
            {rights.entrySeq().map(([key, value]) =>
                <input
                    key={key}
                    type='checkbox'
                    checked={value}
                    onChange={e => onRightsChange(rights.set(key, e.target.checked))}
                />
            )}
        </div>
    }
}
const user=Immutable.Map({
名称:“…”,
accessRights:Immutable.Map({
偏好:对,
联系人:false,
....
})
});
类管理扩展组件{
状态={user};
render(){
返回
this.setState({user:user.set('accessRights',newRights)})
}
/>
}
}
类访问权限扩展组件{
render(){
const{rights,onRightsChange}=this.props;
返回
{rights.entrySeq().map(([key,value])=>
onRightsChange(rights.set(key,e.target.checked))}
/>
)}
}
}

这有意义吗?

是的。如果您需要额外的澄清或保证,只需查看React自己的文档即可:如果不需要从其他组件计算
AccessRights
组件的状态,那么我建议简化这样一个事实,即您每次都在渲染
AccessRights
组件,而不可能需要这样做。您可以使用
shouldComponentUpdate
对照“
nextState
”(参数值通常用于引用
shouldComponentUpdate
中传递的值)检查React
组件的值。对于更大的应用程序,建议使用flex体系结构以方便状态管理。如果您使用上述状态完整组件,您将丢失。是的。如果您需要额外的澄清或保证,只需查看React自己的文档即可:如果不需要从其他组件计算
AccessRights
组件的状态,那么我建议简化这样一个事实,即您每次都在渲染
AccessRights
组件,而不可能需要这样做。您可以使用
shouldComponentUpdate
对照“
nextState
”(参数值通常用于引用
shouldComponentUpdate
中传递的值)检查React
组件的值。对于更大的应用程序,建议使用flex体系结构以方便状态管理。如果使用上面的状态完整组件,您将丢失。