我無法弄清楚如何編寫ui窗口小部件縮減器並且同時對渲染樹進行反應,這樣我就可以稍後使用react-redux將縮減器的結果redux存儲庫映射到渲染樹中的道具。如何將redux存儲區中的封裝ui狀態映射到react-redux的道具?
假設像這樣的設置。我試圖做一個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,我將沒有問題em:
NameApp.jsx:
import { createStore } from 'redux';
import app from './NameReducers';
let store = createStore(app);
...
function render() {
return (
<Provider store={store}>
<NameWidget/>
</Provider>
);
}
但是,我沒有看到如何使這個模塊化。我實際上無法將這個Widget放入其他任何東西中。假設我想這樣做:
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});
(我預計剩餘的代碼,包括connect()和createStore()用於封裝*是顯而易見的。)
這幾乎工作,只要所有封裝的視圖中的所有操作具有唯一類型。但問題是NameWidget的mapStateToProps;它需要從上面改爲使用新的路徑,以它的商店的部分:
...
const mapStateToProps = (state) => {
return {
name: state.nameWidget.name,
};
};
...
等等 - 在某種程度上取決於祖先combineReducers如何()來定義其不斷宏偉的超級小工具和應用程序,後裔必須改變mapStateToProps()的補償方式。這打破了代碼的封裝和可重用性,我看不到如何在react-redux中解決它。我怎樣才能通過組合combineReducers()來定義小部件,然後將結果存儲映射到這些小部件的道具上,這種方式在任何地方都是一次寫入使用的?
(沒有任何答案,似乎很奇怪重複的combineReducers()會創建一個自下而上的形狀,但是mapStateToProps()似乎會採用自頂向下的「絕對路徑」方法來查找該形狀。
你打算在這個出口代碼到另一個項目,或者您是否打算在同一個項目的另一個設置中重新使用該小部件? – Gennon
短期是項目特定的,但如果有一個好的模式/解決方案,希望它會支持這兩種。 – jdowdell
你有沒有看過[redux-form](http://redux-form.com/5.3.1/#/getting-started),他們使用一個定義的名稱(表單)作爲他們自己的root-reducer。這樣,組件將查看所有值的state.form。 – Gennon