【发布时间】:2016-10-21 02:57:33
【问题描述】:
几天前我开始学习 react-redux-immutable,但我仍然对构建我的应用程序感到很困惑。我有 php(symfony/laravel MVC 背景),所以要理解一些 javascript 概念并不容易。
1) 我有行 WrapperComponent:
export default function (props) {
const style = {position: "relative"};
const lines = props.lines;
return (
<div className='wrapper' style={style}>
{lines.map(line => (
<Line key={line.get("id")} {...line.toObject()} />
))}
<Board />
</div>
);
}
2) 连接到 WrapperContainer
import Wrapper from '../components/WrapperComponent';
export default connect(
function mapStateToProps(state) {
return {
lines: state.lines.map(line => {
return line.set("board", {
width: state.board.get("width"),
height: state.board.get("height")
});
})
};
},
function mapDispatchToProps(dispatch) {
return {};
}
)(Wrapper);
3) 然后是 addLine 动作
export function addLine(type) {
return {
type: types.ADD_LINE,
payload: {
id: 3, top: 0, left: 0, diffX: 0, diffY: 0, type: type, board: {
width: 0,
height: 0
}, active: false
}
};
}
4) 与 LinesReducer 对话
export default function LinesReducer(state = initialState, action) {
switch (action.type) {
case types.ADD_LINE:
return state.push(
Map(action.payload)
);
default:
return state;
}
}
5) 让 WrapperContainer 可以监听状态变化并重新渲染行
export default connect(
function mapStateToProps(state) {
return {
lines: state.lines.map(line => {
return line.set("board", {
width: state.board.get("width"),
height: state.board.get("height")
});
})
};
},
function mapDispatchToProps(dispatch) {
return {};
}
)(Wrapper);
现在我的问题是:
关于 addLine 操作的逻辑应该放在哪里?
当我创建一条线时,我想设置它的 id 并且我想将它的宽度设置为与另一个组件的宽度/高度相同。
我猜动作应该只将信息从一个地方传输到另一个地方。
然后我在想......也许逻辑应该存在于 LinesReducer。但是 Lines reducer 无法访问应用程序的全局状态,所以我不知道新行的宽度/高度应该是多少。
然后是 WrapperContainer。容器拥有所有应用程序的状态信息,因此循环遍历每一行并设置 ID(如果未设置并更新其宽度/高度和其他信息)似乎是合理的。
但这对我来说似乎不对。我在考虑一个地方可以收集有关应用程序全局状态的信息,然后它会根据该信息添加新行,而其他任何东西都不会再次触及该行。除了另一个动作。
这是正确的方法吗?我实际上想在另一个组件的高度/宽度发生变化时更改线宽/高度,因此容器对我来说最有意义。
编辑:
也许:
1) 在实际创建行时设置 ID(我只是不知道已经有多少行,所以我真的不知道应该设置什么 ID)
2) 在将行传递给道具时在容器中设置宽度/高度(但如果我最终想在另一个容器中渲染行,我将不得不在那里复制代码,除非我创建一些处理传递的“全局”函数容器中组件道具的行)
【问题讨论】:
标签: javascript reactjs redux react-redux immutable.js