zoukankan      html  css  js  c++  java
  • Vue子组件中 data 从props中动态更新数据

    考虑这样一种情况,Vue 的父组件根据接口 api 获取到数据后,动态更新到子组件的 props 上,这本身也是一个较为简单的操作,

    // 父组件
    <template>
      <div class="hello">
        <chart :info='info'/>
      </div>
    </template>

    在子组件上把数据,直接渲染到模型上即可。

    // 子组件
    <template>
      <div class="hello">
        <ul>
          <!-- 此处 info 来自 props -->
          <li v-for="i in info" :key='i'>{{i}}</li>
        </ul>
      </div>
    </template>
    
    <script>
    export default {
      props:['info'],
      data () {
        return {
          list:[],
        }
      },
      mounted(){
        this.list = this.info.map(i => '0_'+i)
      },
    }
    </script>

    走到这一步,都很顺利,用 一个 list 数据进行动态更新。但如果需要对子组件上的数据进行操作再利用 组件 data 渲染,这时就会发现数据不能动态更新。

    // 子组件
    <template>
      <div class="hello">
        <ul>
          <!-- 此处 list 来自 data -->
          <li v-for="i in list" :key='i'>{{i}}</li>
        </ul>
      </div>
    </template>
    
    <script>
    export default {
      props:['info'],
      data () {
        return {
          list:[],
        }
      },
      mounted(){
        this.list = this.info.map(i => '0_'+i)
      },
    }
    </script>

    这里需要用 watch 来进行跟踪,如下即可

    // 子组件
    <template>
      <div class="hello">
        <ul>
          <!-- 此处list 来自 data -->
          <li v-for="i in list" :key='i'>{{i}}</li>
        </ul>
      </div>
    </template>
    
    <script>
    export default {
      props:['info'],
      data () {
        return {
          list:[],
        }
      },
      mounted(){
        this.list = this.info.map(i => '0_'+i)
      },
      watch: {
        info() {
          this.list = this.info
        }
      }
    }
    </script>

    后记:

    以上操作其实也是走了一些弯路,对于这种 通过对 props 数据操作再赋值给 子组件 data ,导致子组件 data 不能根据 父组件传值变化而及时更新数据的情况。直接用计算属性  computed  : list 

    // 子组件
    <template>
      <div class="hello">
        <ul>
          <!-- 此处comp 来自 computed -->
          <li v-for="i in comp" :key='i'>{{i}}</li>
        </ul>
      </div>
    </template>
    
    <script>
    export default {
      props:['info'],
      computed: {
        comp (){
          return this.info.map(i => '0_'+i)
        }
      },
    }
    </script>

    如上即可

  • 相关阅读:
    招聘.Net中高级软件研发工程师
    布局和救火
    UITableView详解(转)
    iOS开发那些事--性能优化–内存泄露问题的解决(转)
    LeeCode(PHP) 2.add-two-numbers
    LeeCode(PHP) 1.Two Sum
    PHP实现 序列帧拆分
    PHPExcel导出大量数据超时及内存错误解决方法(转)
    laravel路由 实现短连接生成及跳转(php 301重定向)
    从扑克牌中随机抽取5张牌,判断是不是一个顺子,即这5张牌是不是连续(面试题)
  • 原文地址:https://www.cnblogs.com/_error/p/9701136.html
Copyright © 2011-2022 走看看