私はかなり新しく、react と redux を使用して簡単なブックマーク アプリケーションを構築しようとしています。
この問題について頭を回転させることはできません:
ユーザーは1 つのブックマークを作成して、複数のフォルダに追加できます。そのため、アクションをディスパッチし、addMark(bookmark)
その後、addMark(folder)
またはeditFolder(folder)
フォルダーが既に存在する場合。ご覧のとおり、ブックマークとフォルダーは同じアクションで追加されます。これは、私のステート ツリーでは、どちらも単なるマークであり、type プロパティによって区別されるためです。
私の問題:ブックマークのフォルダリストに追加する新しいブックマークであるフォルダオブジェクトをどのように伝えることができますか? 2 つのディスパッチの間に新しく作成されたブックマークの ID を取得するにはどうすればよいですか?
満足できない解決策:
- レデューサーでブックマーク ID が (既存のブックマーク ID を介して) 生成される方法を知っている
Math.max
ので、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);
そして、コンテナー コンポーネントである 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));
これに対する満足のいく解決策が見つかりません。