Vue中watch和computed区别使用场景

转载:https://mp.weixin.qq.com/s/_S7xrBSQZ068Jq_cSMKdLw

项目中,有很多可以巧用watch与computed的场景。

今天就来介绍下vue 中watch及computed区别及使用场景

1、区别

watch中的函数是不需要调用的

computed内部的函数调用的时候不需要加()

watch 属性监听,监听属性的变化

computed: 计算属性通过属性计算而得来的属性

watch需要在数据变化时执行异步或开销较大的操作时使用

对于任何复杂逻辑或一个数据属性在它所依赖的属性发生变化时,也要发生变化,这种情况下,我们最好使用计算属性computed。

computed 属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算。主要当作属性来使用;

computed中的函数必须用return返回最终的结果

当computed中的函数所依赖的属性如果没有发生改变的时候那么调用当前函数的时候结果会从缓存中读取

watch 一个对象,键是需要观察的表达式,值是对应回调函数。主要用来监听某些特定数据的变化,从而进行某些具体的业务逻辑操作;

2、使用场景

computed

当一个属性受多个属性影响的时候就需要用到computed

最典型的例子:购物车商品结算的时候

watch

当一条数据影响多条数据的时候就需要用watch

例子:搜索数据

或者,当一个值改变后,需要做相同的操作时

例子:数据添加,修改,删除后, 列表的值都将改变,值改变后,相做某些统一操作时,即可以使用watch来进行监视,统一处理

el-input输入框实现模糊搜索,computed计算属性和watch区别以及各自的使用

https://mp.weixin.qq.com/s/oRSisaKoKcGq49Hn_31GEA

在这里插入图片描述
在这里插入图片描述

<template>
  <div>
  <!-- 对表格中的姓名模糊搜索 -->
    <el-input v-model="searchVal" @input="inputSearch" placeholder="请输入姓名进行搜索"></el-input>
    <el-table
    :data="tableData"
    border
    style="width: 100%">
    <el-table-column
      prop="date"
      label="日期"
      width="180">
    </el-table-column>
    <el-table-column
      prop="name"
      label="姓名"
      width="180">
    </el-table-column>
    <el-table-column
      prop="address"
      label="地址">
    </el-table-column>
  </el-table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      searchVal: '',
      //表格原数据
      tableData: [{
          date: '2016-05-02',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄'
        }, {
          date: '2016-05-04',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1517 弄'
        }, {
          date: '2016-05-01',
          name: '王小明',
          address: '上海市普陀区金沙江路 1519 弄'
        }, {
          date: '2016-05-03',
          name: '王小路',
          address: '上海市普陀区金沙江路 1516 弄'
        }],
        //用于搜索查询的表格数据
        searchTableData:[{
          date: '2016-05-02',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄'
        }, {
          date: '2016-05-04',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1517 弄'
        }, {
          date: '2016-05-01',
          name: '王小明',
          address: '上海市普陀区金沙江路 1519 弄'
        }, {
          date: '2016-05-03',
          name: '王小路',
          address: '上海市普陀区金沙江路 1516 弄'
        }]//用来搜索的表格数据
    }
  },
  methods:{
    //模拟接口获取数据
    getData(){
      let params = {
        projectId: '9999'
      }
      this.$get(this.$api.test(),params).then(res=>{
        if (res.code !== 200) {
          return this.$message.error(`${res.msg} `)
        }
        //在这里拿到原始数据后,进行赋值
        this.tableData = res.records || []
        //表格搜索
        this.searchTableData = res.records || []
      })
    },
    //根据姓名进行搜索
    inputSearch(){
      const search = this.searchVal.trim()
      //切记:搜索时,不能直接用原始tableData去过滤,因为会改变原始数据结构,
      // 所以我们应该创建一个新的数组,用来存储原始数据,专门对姓名进行过滤
      //之后将过滤出来的数据进行赋值,实现模糊搜索功能
        this.tableData=this.searchTableData.filter(item=>item.name.indexOf(search)>-1)
    }
  }
}
</script>

在这里插入图片描述

<template>
  <div id="app">
   <!-- 输入框 -->
   <el-input type="text" v-model="value" placeholder="请输入姓名/年龄"></el-input>
   <!-- 给table表格赋值 -->
   <el-table
    :data="tableDataA"
    border
    style="width: 100%">
    <el-table-column
      prop="age"
      label="年龄"
      >
    </el-table-column>
    <el-table-column
      prop="name"
      label="姓名"
      >
    </el-table-column>
    </el-table>
  </div>
 </template>
 <script>
export default{
  data() {
   return {
    value: '',
    tableData: [
      { name: '张三', age: '18' },
      { name: '张四', age: '17' },
      { name: '张五', age: '17' },
      { name: '老六', age: '18' },
      { name: '老八', age: '18' },
      { name: '小三', age: '19' },
      { name: 'Xingyue', age: '18' },
     ],
    //表格B用原表格的数据
    tableDataB: [
      { name: '张三', age: '18' },
      { name: '张四', age: '17' },
      { name: '张五', age: '17' },
      { name: '老六', age: '18' },
      { name: '老八', age: '18' },
      { name: '小三', age: '19' },
      { name: 'Xingyue', age: '18' },
     ],
    };
   },
   //使用计算属性
   computed:{
      tableDataA(){
            // 返回过滤后的数组
            return this.tableDataB.filter((p)=>{
              return p.name.indexOf(this.value) !==-1 || p.age.indexOf(this.value) !==-1
            })
          }
        }
 }
</script>

第三种:使用watch属性进行监听,对数据过滤

在这里插入图片描述
在这里插入图片描述

<el-form>
   <el-row>
     <el-col :span="24" style="display:flex;justify-content:flex-end;">
       <span><i>当前价税合计:</i>{{Total}}</span>
     </el-col>
   </el-row>
 </el-form>
computed:{
    Total(){
      let price = 0;
      for (let i = 0;i<this.tableData.length;i++) {
        price += this.tableData[i].taxUnitPrice * this.tableData[i].invNum
      }
      this.detailedSend.total = price
      return price;
    },
  },

在这里插入图片描述

computed、methods、watch的区别?

https://mp.weixin.qq.com/s/0DYMmlE6UaXQI9c3yyoBlA

在这里插入图片描述

<template>
  <div></div>
</template>
<script>
export default {
  data() {
    return {
      num1: 5,
      num2: 10,
      nums: 15,
    };
  },
  computed: {
    addNum: function () {
      return Number(this.nums) + Number(this.num1) + Number(this.num2);
    },
  },
  mounted() {
    console.log(this.addNum);// 30
  },
};
</script>

在这里插入图片描述

<template>
  <div>
    <el-button @click="addOn">点击</el-button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      count: 0,
    };
  },
  methods: {
    addOn() {
      this.count++;
      console.log(this.count);
    },
  },
};
</script>

在这里插入图片描述

<template>
  <div>
    <el-input v-model="inputValue"></el-input>
  </div>
</template>

<script>
export default {
  data() {
    return {
      inputValue: "yuanshi",
    };
  },
  watch: {
    inputValue: "methOn",
  },
  methods: {
    methOn() {
      console.log(111);
    },
  },
};
</script>

在这里插入图片描述

addOn:{}

在这里插入图片描述

addOn(){}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值