gpt4 book ai didi

reactjs - 如何使用react-redux将redux存储中封装的ui状态映射到props?

转载 作者:行者123 更新时间:2023-12-03 14:28:49 24 4
gpt4 key购买 nike

我在弄清楚如何组合 ui 小部件 reducer 和串联 react 渲染树时遇到了麻烦,这样我以后就可以使用react-redux 将 reducer 的最终 redux 存储映射到渲染树中的 props。

假设有这样的设置。我正在尝试制作一个可以在任何应用程序中的任何位置使用的 NameWidget:

NameView.jsx:
...
render() {
return <div> Name: {this.props.name} </div>;
}
...

====

NameAction.js:
...
export const CHANGE_NAME = 'CHANGE_NAME';
...
export function changeNameAction(newName) {
return {
type: CHANGE_NAME,
payload: newName,
};
}

====

NameReducer.js:

import { CHANGE_NAME } from './NameAction';

function ui(state = {name: ''}, action) {
switch(action.type) {
case(CHANGE_NAME):
return Object.assign({}, state, {name: action.payload});
break;
default:
return state;
}
}

export default ui;

====

NameWidget.js:

import { connect } from 'react-redux';
import { NameView } from './NameView';

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

const NameWidget = connect(
mapStateToProps
)(NameView);

export default NameWidget;

如果我直接使用 NameWidget 就没有问题:

NameApp.jsx:

import { createStore } from 'redux';
import app from './NameReducers';
let store = createStore(app);
...
function render() {
return (
<Provider store={store}>
<NameWidget/>
</Provider>
);
}

但是,我不知道如何使其模块化。我实际上无法将此小部件放入其他任何东西中。假设我想这样做:

EncapsulatingView.jsx:
...
render() {
return (
<div>
<NameWidget/>
<SomeOtherReduxWidget/>
</div>
);
}
...

====

EncapsulatingReducer.js:
import { combineReducers } from 'redux'
import nameWidget from '../name/NameReducer';
import someOtherWidget from '../someOther/SomeOtherReduxWidgetReducer';

export default combineReducers({nameWidget, someOtherWidget});

(我希望剩下的代码包括用于 Encapsulating* 的 connect() 和 createStore() 是显而易见的。)

只要所有封装 View 中的所有操作都具有唯一的类型,这几乎就可以工作。但问题是NameWidget的mapStateToProps;它需要从上面进行更改才能使用商店其部分的新路径:

...
const mapStateToProps = (state) => {
return {
name: state.nameWidget.name,
};
};
...

依此类推 - 根据祖先如何 mergeReducers() 定义其更宏伟的 super 小部件和应用程序,后代必须以某种方式改变他们的 mapStateToProps() 进行补偿的方式。这破坏了代码的封装性和可重用性,我不知道如何在react-redux中绕过它。如何通过组合 mergeReducers() 来定义小部件,然后以“一次写入,随处使用”的方式将结果存储映射到这些小部件的 Prop ?

(没什么,重复的combineReducers()创建了一个自下而上的形状似乎很奇怪,但是mapStateToProps()似乎假设采用自上而下的“绝对路径”方法来查找该形状。)

最佳答案

有趣的问题。我想知道要求父级生成 guid 并通过 props 向下传递是否符合您的目的,然后您只需将其用作小部件该实例的状态对象的索引即可。因此,每当您要创建此小部件的新实例时,您都需要在父级中为其创建一个 ID,然后将其传递到 props 中,然后它将可用于 connect 方法在mapStateToProps 和mapDispatchToProps 中使用。我想理论上你甚至可以自己创建这个父组件,并且它在使用时可能是透明的,并且只需使用 componentDidMount 生成一个新的 guid 来存储在组件状态中并传递给子组件。

关于reactjs - 如何使用react-redux将redux存储中封装的ui状态映射到props?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38650050/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com