React 转换服务器响应(向对象添加额外字段)

Posted

技术标签:

【中文标题】React 转换服务器响应(向对象添加额外字段)【英文标题】:React Transforming Server Response (adding extra field to an Object) 【发布时间】:2019-01-17 02:23:26 【问题描述】:

我有一个发送 axios GET 请求并将响应(对象数组)设置为状态的基本函数。

getData()
  axios.get(url)
    .then(response => this.setState( data: response.data )

但是我想向对象添加一个附加字段。我该怎么做?

我认为是这样的:

getData()
  axios.get(url)
    .then(response => transformRes(response.data))
    .then(newResponse => this.setState( data: newResponse )


transformRes(data)
  data.forEach(d => 
    // do something ??
  
  // return newData ??

模拟示例数据(来自服务器)

(2) [..., ...]

0: id: 1, name: 'foo'
1: id: 2, name: 'bar'

模拟预期结果(transformRes 之后)

(2) [..., ...]

0: id: 1, name: 'foo', desc: 'active' // added desc field.
1: id: 1, name: 'bar', desc: 'active' // added desc field. 

【问题讨论】:

【参考方案1】:

只需在地图函数中添加属性:

getData()
  axios.get(url)
    .then(response => 
       const res = response.data
       this.setState( data: res.map(object => 
         return ...object, desc: 'active'
        ))
    )

顺便说一句,... 是扩展运算符,...object 表示object 中的每个key/value

【讨论】:

如果您没有可用的扩展运算符,您可以使用 Object.assign 代替它(如果您正在使用反应,您可能会这样做)。 谢谢,这行得通。解释也很好。不过我不得不做些小改动。【参考方案2】:

基本上,您希望将旧对象映射到新对象。使用.forEach,您在正确的轨道上

getData() 
    axios.get(url)
        .then(response => 
            var newData = response.map((data) => 
                data.desc = 'active'; //add your properties here
                return data;
            );
            this.setState(data: newData);
        );

如果这不适用于您的情况或您有疑问,请告诉我。

【讨论】:

我必须复制每个字段吗?例如data.id = data.id ? 其实我把上面的代码搞砸了。请查看固定版本。不,您不必复制现有字段,只需复制新字段即可。

以上是关于React 转换服务器响应(向对象添加额外字段)的主要内容,如果未能解决你的问题,请参考以下文章

向 ModelForm 添加额外字段

React Redux 添加额外的操作字段导致承诺返回不同

向 ModelAdmin 表单添加额外字段

在 React Native 中向数组添加新对象

如何在响应中添加额外字段以了解哪个项目触发了搜索结果

向 mysql 插入脚本添加额外的表单发布字段