Vue的watch功能:实现响应式数据更新

2023-12-29 23:26:58

watch是vue内部提供的一个用于侦听功能的更通用的方法,其用来响应数据的变化,通过特定的数据变化驱动一些操作。简言之:当需要被watch监听的数据发生变化时就会被执行watch中的逻辑。实现数据的实时更新!

普通监听

<template>
	<div></div>
</template>
<script>
	export default {
		data(){
			variable:null,
		},
		watch:{
			// 此处监听variable变量,variable的值变化就会执行以下variable变量后的方法体
			variable(val){
				// 变化后需要执行的逻辑
			}
		}
	}
</script>

如上:当监听到变量variable产生变化时,会被页面侦听到并执行相应的的逻辑。在实际开发中,所有需要被监听的变量都需要写在watch中,这样可在监听到变量发生变化时执行相应的逻辑。

深度监听deep

普通变量的变化的侦听是使用以上方法,当所需侦听的变量是对象时则不起作用,这时就需要使用deep属性进行深度监听。如下所示:

<template>
	<div></div>
</template>
<script>
	export default {
		data(){
			myObject:{
				value:''
			},
		},
		watch:{
				myObject:{
				// 此处监听myObject属性value变量
				handler(val){
					
				      },
				deep:true
			   }
	        }
			
		}

</script>

案例

先上代码:

export default {
  props: {
    //prop定义要求使用该组件时需要绑定bar-chart进行传值
    barDataChart:{
      type: Object,
      required: true
    }
  },
  data() {
    return {
      chart: null
    }
  },
  //监听barChart中值的变化
  watch:{
    barDataChart:{
      deep:true,
      handler(val){
        this.setOptions(val)
      }
    }
  },
  mounted() {
    this.$nextTick(() => {
      this.initChart()
    })
  },
  beforeDestroy() {
    if (!this.chart) {
      return
    }
    this.chart.dispose()
    this.chart = null
  },
  methods: {
    initChart() {
      this.chart = echarts.init(this.$el, 'macarons')
      this.setOptions(this.barDataChart)
    },
    setOptions({work_days, hj_main_count, hj_right_count, hj_left_count, hj_main, hj_right, hj_left}) {
      this.chart.setOption({
        tooltip: {
          trigger: 'axis',
          axisPointer: { // 坐标轴指示器,坐标轴触发有效
            type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
          }
        },
        grid: {
          top: 10,
          left: '2%',
          right: '2%',
          bottom: '3%',
          containLabel: true
        },
        xAxis: [{
          type: 'category',
          data: work_days,
          // name:'日期',
          nameLocation: 'middle', // 显示位置
          nameTextStyle: {
            fontWeight: 'bold' // 字体加粗
          },
          axisTick: {
            alignWithLabel: true
          }
        }],
        yAxis: [
          {
          type: 'value',
          axisTick: {
            show: false
          },
         // 设置轴单位显示格式---------------
          axisLabel: {
              formatter: '{value} 次'
            }
        }],
        series: [{
          name: hj_main,
          type: 'bar',
          stack: 'vistors',
          barWidth: '60%',
          data: hj_main_count,
          animationDuration,
          itemStyle: { // 设置折线图样式
            color: '#FFA500' // 设置折线的颜色为橙色
          }

        }, {
          name: hj_right,
          type: 'bar',
          stack: 'vistors',
          barWidth: '60%',
          data: hj_right_count,
          animationDuration,
          itemStyle: { // 设置折线图样式
            color: '#CD5C5C' // 设置折线的颜色为橙色
          }
        }, {
          name: hj_left,
          type: 'bar',
          stack: 'vistors',
          barWidth: '60%',
          data: hj_left_count,
          animationDuration
        }]
      })
    }
  }
}
</script>

barDataChart是一个 props 属性,它通过组件的父组件传递进来,并且是一个对象类型。当 chartData 发生变化时,watch 监听器会自动执行其中定义的逻辑。

barDataChart:{
      type: Object,
      required: true
    }

?在watch中深度监听barChart中值的变化,当barDataChart值发生变化时,执行this.setOptions方法,并将val值作为参数传入。

  //监听barChart中值的变化
  watch:{
    barDataChart:{
      deep:true,
      handler(val){
        this.setOptions(val)
      }
    }
  },

?在如上的监听器中,我们设置了 deep: true 选项,表示要深度监听 chartData 对象的变化。也就是说,当 chartData 内部的属性发生改变时,监听器也会触发。其中handler 是监听器的回调函数,它接收一个参数 val,表示 chartData 的新值。在这个回调函数中,当监听到数据变化时,我们要执行了组件的 setOptions 方法,并将 chartData 的新值作为参数传递进去。

附完整代码:

<template>
  <div :class="className" :style="{height:height,width:width}" />
</template>

<script>
import * as echarts from 'echarts';
require('echarts/theme/macarons') // echarts theme
import resize from './mixins/resize'

const animationDuration = 6000

export default {
  mixins: [resize],
  props: {
    className: {
      type: String,
      default: 'chart'
    },
    width: {
      type: String,
      default: '100%'
    },
    height: {
      type: String,
      default: '300px'
    },
    //prop定义要求使用该组件时需要绑定bar-chart进行传值
    barDataChart:{
      type: Object,
      required: true
    }
  },
  data() {
    return {
      chart: null
    }
  },
  //监听barChart中值的变化
  watch:{
    barDataChart:{
      deep:true,
      handler(val){
        this.setOptions(val)
      }
    }
  },
  mounted() {
    this.$nextTick(() => {
      this.initChart()
    })
  },
  beforeDestroy() {
    if (!this.chart) {
      return
    }
    this.chart.dispose()
    this.chart = null
  },
  methods: {
    initChart() {
      this.chart = echarts.init(this.$el, 'macarons')
      this.setOptions(this.barDataChart)
    },
    setOptions({work_days, hj_main_count, hj_right_count, hj_left_count, hj_main, hj_right, hj_left}) {
      this.chart.setOption({
        tooltip: {
          trigger: 'axis',
          axisPointer: { // 坐标轴指示器,坐标轴触发有效
            type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
          }
        },
        grid: {
          top: 10,
          left: '2%',
          right: '2%',
          bottom: '3%',
          containLabel: true
        },
        xAxis: [{
          type: 'category',
          data: work_days,
          // name:'日期',
          nameLocation: 'middle', // 显示位置
          nameTextStyle: {
            fontWeight: 'bold' // 字体加粗
          },
          axisTick: {
            alignWithLabel: true
          }
        }],
        yAxis: [
          {
          type: 'value',
          axisTick: {
            show: false
          },
         // 设置轴单位显示格式---------------
          axisLabel: {
              formatter: '{value} 次'
            }
        }],
        series: [{
          name: hj_main,
          type: 'bar',
          stack: 'vistors',
          barWidth: '60%',
          data: hj_main_count,
          animationDuration,
          itemStyle: { // 设置折线图样式
            color: '#FFA500' // 设置折线的颜色为橙色
          }

        }, {
          name: hj_right,
          type: 'bar',
          stack: 'vistors',
          barWidth: '60%',
          data: hj_right_count,
          animationDuration,
          itemStyle: { // 设置折线图样式
            color: '#CD5C5C' // 设置折线的颜色为橙色
          }
        }, {
          name: hj_left,
          type: 'bar',
          stack: 'vistors',
          barWidth: '60%',
          data: hj_left_count,
          animationDuration
        }]
      })
    }
  }
}
</script>

文章来源:https://blog.csdn.net/weixin_52890053/article/details/135298853
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。