最近开发Vue的工作中遇到一个问题,在项目中查看数据调用相同子组件时,获取的数据在子组件中不刷新。目前的代码是在子组件中用props来接收传值,在 created里把接收的值放到相关的控件里。经过一步一步的调试后发现,第一次获取文章信息调用子组件有运行 created 这一步,但是第二次获取不同的文章调用相同的子组件时,却没有运行到 created 这一步,结果就导致了子组件里面的显示没有更新了。

原因vue会复用相同的组件,将不再执行created,mounted之类的钩子,所以项目放在created上面也就不更新数据了。

解决:有网友说通过设置路由钩子beforeRouteUpdate或者监听$route的变化来执行相关方法更新数据。也可以通过给子组件添加 :key 值来处理,或者使用 this.$forceUpdate() 来强制更新。下面我们来使用 watch 监听路由变化来手动更新数据。

<template>
  <div>
	<el-input v-model="boolFormData.bool1" placeholder="如:开">
		<template slot="prepend">开</template>
	</el-input>
	<el-input v-model="boolFormData.bool0" placeholder="如:关">
		<template slot="prepend">关</template>
	</el-input>
  </div>
</template>
<script>
export default {
  name: 'BoolTree',
  props: {
    formData: Object
  },
  watch: {
    formData: {
      handler(val, oldVal){
        this.boolFormData.bool1 = val.bool1
        this.boolFormData.bool0 = val.bool0
      },
      deep:true //true 深度监听
    }
  },
  data() {
    return {
      boolFormData: {
        bool1: '',
        bool0: ''
      }
    }
  },
  created() {
    this.boolFormData.bool1 = this.formData.bool1
    this.boolFormData.bool0 = this.formData.bool0
  }
</script>