reactjs - Redux:如何调度唯一的对象键(唯一的 Id,而不是硬编码)
问题描述
我有一个名为 Redux 的操作makePost
,它接收如下所示的数据:
{
comment: false,
comments_text: "",
like: 0,
name: "test"
}
然后,该操作会将数据推送到 Firebase 实时数据库。然后它调度另一个动作(称为post
)以使用数据更新当前的 React 状态,并包含一个唯一的响应 id(id: response.key
)。它看起来像这样:
export const makePost = (postObject) => {
return (dispatch, getState) => {
const uid = getState().userId;
database
.ref(`users/${uid}/posts`)
.push(postObject)
.then((response) => {
dispatch(
post({
key: uid,
id: response.key,
...postObject,
})
)
})
}
}
post
调度动作如下所示:
export const post = (post) => {
return {
type: "POST",
payload: {
key: post.key,
handle: "PLACEHOLDER",
posts: {
postKey: {
name: post.name,
like: post.like,
comment: false,
comments_text: []
}
}
}
}
}
我的问题是关于id: response.key
. 当我调度时post
,我希望postKey
(object key) 是唯一的响应 id ( id: response.key
),而不是硬编码为postKey
. 有没有办法动态地做到这一点?我试着把它写成, post.id
但这不起作用。
作为参考,POST
reducer 如下所示:
const postsReducer = (state = [], action) => {
switch (action.type){
case POST:
return [...state, action.payload];
这是我的 React 状态目前的样子,请注意之前的数据(对象 1)具有唯一的响应 ID,但最新的帖子(对象 2)被硬编码为postKey
:
解决方案
您想在返回的对象上使用计算属性名称post
。
对象初始值设定项语法还支持计算属性名称,允许您将表达式放在括号
[]
中,该表达式将被计算并用作属性名称。let some_key = 'abc'; let obj = { [some_key]: 123 }; // obj = { abc: 123 }
因此,在您的情况下,请[post.id]
用作此计算属性:
export const post = (post) => {
return {
type: "POST",
payload: {
key: post.key,
handle: "PLACEHOLDER",
posts: {
// Assumes that `post.id` exists
[post.id]: {
name: post.name,
like: post.like,
comment: false,
comments_text: [],
},
},
},
};
};
推荐阅读
- javascript - 如果给定多个“案例”,我如何修改先前修改的变量而不是连接到它?
- python - Python; 原始列表在函数内发生变化
- python - pyqt QTabWidget setCornerWidget TopRightCorner
- c - 使用嵌套 for 循环使用 C 查找数字的二次幂
- windows - 有没有办法让 python 程序不可关闭?
- javascript - 使普通对象可迭代。(javascript)
- swift - 在 Swift 中多态地解码 KeyedDecodingContainer 的子对象
- javascript - 如何使用 Vega / Vega-lite 呈现类/组织/流/状态图/图表
- javascript - reactjs中如何导出一个类
- kubernetes - prometheus operator helm chart 安装失败,因为 prom admission serviceaccount 错误