VUE父组件数据改变,子组件数据并未发生改变(那是因为你没写监听)附带子组件的写法

Posted myfirstboke

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VUE父组件数据改变,子组件数据并未发生改变(那是因为你没写监听)附带子组件的写法相关的知识,希望对你有一定的参考价值。

技术分享图片

 父组件有三个按钮,年、月、日 点击之后父组件的数据发生改变,子组件却没改变,打印接受的数据,除了第一次其他都没打印,那是因为你没有写监听

<template>
  <div class="left_two_middle">
      <ul class="title margin-top">
        <li>排名</li>
        <li>地区</li>
        <li>出游人数</li>
        <li>占比</li>
      </ul>
       <el-scrollbar style="height:100%">
      <ul class="title" v-for="(item,index) in items">
        <li>{{index+1}}</li>
        <li v-if="item.touristCity">{{item.touristCity}}</li>
        <li v-if="item.scenicName">{{item.scenicName}}</li>
        <li v-if="item.touristProvince">{{item.touristProvince}}</li>
        <li v-if="item.touristCountry">{{item.touristCountry}}</li>
        <li>{{item.num}}</li>
        <li>
          <el-progress :percentage="Number((item.pro*100).toFixed(2))"
                       :color="index<6 ? ‘rgb(254,203,24)‘:‘rgb(0,181,255)‘"></el-progress>
        </li>
      </ul>
    </el-scrollbar>
  </div>
</template>

<script>
export default {
  name: "myTable",
  props:{
    dataSource:{
        type:Array
    }
  },
  data() {
    return {
      items: []
    };
  },
  methods: {},
  mounted() {
//      console.log(this.dataSource,‘父传过来的数据‘)
    this.items=this.dataSource
  },
  watch: {
    dataSource: {
      immediate: true,    // 这句重要
      handler (val) {
          this.items=val
      }
    }
  }

};
</script>
<style scoped lang="less">
  .left_two_middle {
    width: 100%;
    height: 80%;
    .title {
      font-size: 12px;
      line-height: 25px;
      padding-right: 15px;
      padding-left: 5px;
      display: flex;
      justify-content: space-between;
      align-items: center;
      li {
        text-align: center;
        list-style: none;
        padding: 3px 0;
        color: white;
      }
      li:first-child {
        width: 10%;
      }
      li:nth-child(2) {
        width: 30%;
      }
      li:nth-child(3) {
        width: 25%;
      }
      li:last-child {
        width: 35%;
      }
    }
  }
</style>
<style>
  .el-scrollbar__wrap{
    overflow-x: hidden;
  }
  .el-progress {
    display: flex;
    justify-content: space-between;
    align-items: center;
    position: relative;
    line-height: 1;
  }
  .el-progress-bar {
    padding-right: 30px;
    width: 85%;
  }
  .el-progress__text {
    font-size: 12px !important;
    color: #fff;
  }
</style>

 

 

完整代码

父子组件传递数组,created中调接口获取数据,然后赋值,然后子组件收到的却是空数据why  因为你还没获取到数据,组件都渲染了,所以组件加个v-if=‘this.arr.length>0‘就搞定;如下

 

父组件的写法:一定要v-if,不然子组件已经渲染了,却没有数据

技术分享图片

 

以上是关于VUE父组件数据改变,子组件数据并未发生改变(那是因为你没写监听)附带子组件的写法的主要内容,如果未能解决你的问题,请参考以下文章

vue props原理

vue父组件数据变化,子组件不变的情况解决

vue解决子组件值改变父组件的值跟着变

vuex 实现vue中多个组件之间数据同步以及数据共享。

vue子组件监听父组件数据变化并作出改变(亲测有效)

VUE里子组件获取父组件动态变化的值