got*_*ype 5 javascript reactjs redux redux-thunk react-redux
我很新,并尝试使用react&redux构建一个简单的书签应用程序.
我无法解决这个问题:
用户可以创建一个书签并将其添加到多个文件夹.所以我发出一个addMark(bookmark)动作,之后addMark(folder)或者editFolder(folder)文件夹已经存在.正如您所看到的,书签和文件夹是通过相同的操作添加的,因为在我的状态树中,它们都只是标记 - 由它们的类型属性区分.
我的问题:如何告诉文件夹对象哪个是新书签添加到书签的文件夹列表?如何在两个调度之间检索新创建的书签的ID?
解决方案我觉得不满意:
Math.max书签ID (通过现有的书签ID),因此我可以在2个调度之间重现新的书签ID.这听起来像是一个糟糕的黑客.一点源代码,了解我所拥有的:
// mapping between dispatcher and props to my react view
const mapDispatchToProps = (dispatch) => ({
saveMark: (mark) => {
if (mark.id) {
dispatch(editMark(mark));
} else {
dispatch(addMark(mark));
}
},
});
export default connect(mapStateToProps, mapDispatchToProps)(AddMark);
Run Code Online (Sandbox Code Playgroud)
在AddMark中,它是容器组件:
// save the bookmark first
this.props.saveMark({
type: 'bookmark',
title: this.state.title,
url: this.state.url,
icon: this.props.icon,
style: this.state.style,
});
// now I need the bookmark ID
folders.forEach(folder => {
folder.children.push(bookmarkID) // <-- !!!
});
folders.forEach(folder => this.props.saveMark(folder));
Run Code Online (Sandbox Code Playgroud)
我找不到令人满意的解决方案.
我认为您应该在此处仅分派一个操作:addBookmark(),它接受书签对象和文件夹。
您处理将书签对象添加到文件夹的代码应该是减速器的一部分。
另外,请参考Redux 项目中的Todos 示例。它在创建动作时提供了 id,以便可以在组件中读取它。您还可以使用当前状态来计算最新的 id:
function addBookmark(bookmark, folder) {
return (dispatch, getState) => {
const newBookmark = Object.assign({
id: Math.max(0, ...getState().bookmarks.map(b => b.id)) + 1,
}, bookmark);
dispatch({
type: 'ADD_BOOKMARK',
bookmark: newBookmark,
folder: folder
});
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,该示例需要redux-thunk中间件来分派这些操作。
然后您可以在文件夹缩减器中访问带有 id 的书签
function folderReducer(state = [], action) {
if(action.type === 'ADD_BOOKMARK') {
return state.map(folder => {
if(folder === action.folder) {
return Object.assign({}, folder, {children: [...folder.children, action.bookmark.id]}
}
return folder;
})
}
//another reducer code
return state;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2334 次 |
| 最近记录: |