收藏
回答

关于 setData 的一个问题

问题模块
API和组件



如图。


如果我在代码中写

Page({
  data: {
    text: 'init data',
    array: [{text: 'init data'}],
    object: {
      text: 'init data'
    }
  }
})


如果调用

this.setData({
   'array[0].text':'changed data'
})

按照文档所说,此时, this.data.array[0].text 应该会变成 changed data 。


如果我调用

this.setData({
   'arr[0].text':'changed data',
})

按照文档所说,此时, this.data.arr[0].text 应该会变成 changed data 。


那如果,我需要 this.data['arr[0].text '] 赋值,应该如何处理?


又或者,这样调用


this.setData({
   'array[0].text':'changed data',
   'text':'changed text'
})

这时候,又应该如何进行呢?

选项一:this.data.text === ‘changed text’, this.data.array[0].text === ‘changed data’

选项二:this.data.text === ‘changed text‘, this.data['array[0].text'] === ‘changed data’


(通过实际代码运行结果,是选项一为答案)


参考 lodash 的做法,是 _.set(obj, path, value) ,确定了一定是切割 path 进行数据创建的,但是只局限于一次进行一个 path 的设置。


疑惑就是这个,希望能解答。


最好就是能把内部实现的 setData 代码贴出来,方便查阅。

最后一次编辑于  2017-02-08  (未经腾讯允许,不得转载)
邀请回答
复制链接收藏投诉关注问题回答

2 个回答

  • 大饼
    大饼
    2017-02-09

    写了个测试代码。


    Page({
      data: {
        text: 'init data',
        array: [{falg: false, text: 'init data'}],
        obj: {
          text: 'init data'
        }
      },
     
      setData1 () {
        this.setData({
          'array[0].text':'changed data 1',
        })
        console.log(this.data);
      },
     
      setData2 () {
        this.setData({
          'arr[0].text':'changed data 2',
        })
        console.log(this.data);
      },
     
      setData3 () {
        this.setData({
           'array[0].text':'changed data 3',
           'arr[0].text':'changed data',
           'arr[1].text':'changed data',
           'arr[2]-text':'changed data',
           '_arr[2]-text':'changed data',
           'text':'changed text',
        })
        console.log(this.data);
      },
     
      setData4 () {
        this.setData({
           array: [{
            text: 'changed data 4',
           }],
           'arr[0].text':'changed data',
           'arr[1].text':'changed data',
           'arr[2]-text':'changed data',
           '_arr[2-text':'changed data',
           'text':'changed text',
        })
        console.log(this.data);
      },
     
      setData5 () {
        this.setData({
           array: [{
            text: 'changed data 5',
           }]
        })
        console.log(this.data);
      },
    })


    <view class="index">
      <view class="index-desc">setData 测试</view>
      <button type="default" bindtap="setData1">setData1</button>
      <button type="default" bindtap="setData2">setData2</button>
      <button type="default" bindtap="setData3">setData3</button>
      <button type="default" bindtap="setData4">setData4</button>
      <button type="default" bindtap="setData5">setData5</button>
    </view>


    2017-02-09
    赞同
    回复
  • 老马
    老马
    2018-02-22
     obj: {
          text: 'init data'
        }

    你这个又怎么赋值呢??

    2018-02-22
    赞同
    回复