Vue基础-计算属性 watch 条件渲染 列表渲染

计算属性

  • 当模板内的JS表达式复杂到我们难以维护时,我们要引入计算属性
    <div id="app">
    {{text.split('').reverse().join('')}}
    </div>
    
  • 对于任何复杂逻辑,都应当使用计算属性
计算属性与method方法的区别

计算属性

  • 包含getter和setter
  • 基于依赖缓存
  • 依赖数据改变=>触发setter和getter=>计算属性改变
  • 可以依赖其他计算属性
  • 可以依赖其他实例数据
    methods方法
  • 本质是实例上定义的普通函数,组件重新渲染,就会调用

如何选择:

  • 是否需要缓存,比如遍历大数组和做大量计算,一个数据受到多个数据影响,使用计算属性
Demo
<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>计算属性及watch</title>
  <script src="../lesson2/node_modules/vue/dist/vue.min.js"></script>
</head>

<body>
  <div id="app">
    <p>苹果手机单价:<input v-model="price1"> 数量:<input v-model="number1"></p>
    <p>华为手机单价:<input v-model="price2"> 数量:<input v-model="number2"></p>
    <p>锤子手机单价:<input v-model="price3"> 数量:<input v-model="number3"></p>
    <div>直接计算:{{price1 * number1 + price2 * number2 + price3 * number3 }}</div>
    <div>计算属性计算:{{totalPrice}}</div>
    <div>方法计算:{{cacTotalPrice()}}</div>
  </div>
</body>
<script>
  let app = new Vue({
    el: "#app",
    data: {
      price1: '',
      number1: 0,
      price2: '',
      number2: 0,
      price3: '',
      number3: 0,
    },
    computed: {
      totalPrice: function () {
        let { price1, number1, price2, number2, price3, number3 } = this;
        return price1 * number1 + price2 * number2 + price3 * number3
      }
    },
     //监听
    watch: {
      price1: function (newVal, oldVal) {
        console.log(newVal, oldVal);
      },
      appleInfo: {
        handler: function(newVal, oldVal) {
          console.log(newVal, oldVal);
        },
        //是否深度监听
        deep: true,
        //是否以当前的初始值执行handler函数
        immediate: true,
      }
    },
    methods:{
      cacTotalPrice(){
        let { price1, number1, price2, number2, price3, number3 } = this;
        return price1 * number1 + price2 * number2 + price3 * number3
      }
    }
  })
</script>

</html>

Watch

watch使用场景

  • 一个数据影响多个数据。
    //监听
    watch: {
      price1: function (newVal, oldVal) {
        console.log(newVal, oldVal);
      },
      appleInfo: {
        handler: function(newVal, oldVal) {
          console.log(newVal, oldVal);
        },
        //是否深度监听
        deep: true,
        //是否以当前的初始值执行handler函数
        immediate: true,

      },

    },
computed和watch的区别:

computed的结果会被缓存,除非依赖的响应式属性发生变化才会重新计算,虽然是一个方法,但是被当作一个属性使用,watch是一个对象;他的键是要被观测的值,值是对应的函数,来监听某些特定的数据的变化,来做某些业务操作,可以看作computed和methods的结合体。

条件渲染

v-if,v-else-if,v-else/ v-show

  • v-if,v-else-if,v-else与JavaScript的条件语句if,else,else if类似;
  • v-show不管初始条件是什么,元素总是被渲染,并且只是简单地基于CSS进行显示隐藏切换。

v-else-if 要紧跟v-if, v-else 要紧跟v-else-if 或者v-if,表达式为真时当前元素/组件及所有子节点将被渲染,为假时被移除。v-show是显示或者隐藏,不对DOM进行操作。

<div i = "app"
  <div v-if="type === 1">type={{type}}</div>
  <div v-else-if="type === 2">type={{type}}</div>
  <div v-else>type={{type}}</div>
  <div v-show="isShow">{{type}}</div>
</div>
v-if使用场景v-show使用场景
运行条件较少改变需要频繁切换(tab切换)
展示带权限列表展示前台页面数据
可以在template上使用不可以在template上使用

列表渲染

v-for使用

当需要将一个数组遍历或枚举一个对象循环显示时,就会用到列表渲染指令 v-for。它的表达式需结合in来使用,类似item in items的形式。

  <div id="app">
    <div>
      <ul>
        <li v-for="(item, index) in myList">{{ index + "" + item.name}}</li>
        <li v-for="item in obj">{{item}}</li>
      </ul>
    </div>
  </div>
  <script>
    let app = new Vue({
      el: '#app',
      data: {
        myList: [
          {name: 'vue基础课程'},
          {name: 'vue进阶课程'},
          {name: 'vue高级课程'},
          {name: 'vue实战课程'},
          {name: 'vue+webpack课程'},
        ],
        obj:{
          name: "Felix",
          age: 30
        }
      }
    })
  </script>
维护状态

为了给Vue一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,需要为每一项提供一个唯一的key。

<div v-for = "item in items" v-bind:key = "item.id">
  <!-- 内容 -->
</div>
注意事项
  • 不推荐同时使用v-if和v-for
  • 列表渲染给每项加上key

表单

  • 文本输入绑定

    //单行文本
    <input v-model="message" placeholder="输入">
    //多行文本
    <textarea v-model="message" placeholder="输入">
    
  • 选择框输入绑定

    //单选按钮
    <input type="radio" name="radio" value="1" v-model="param">
    //复选框
    <input type="checkbox" v-model="checkVal" :true-value="trueValue" :false-value="falseValue">
    //下拉选择
    <select name="" id="" v-model="selected" multiple>
      <option value="">请选择</option>
      <option value="1">A</option>
      <option value="2">B</option>
      <option value="3">C</option>
    </select>
    
  • 修饰符
    v-model.lazy :

      从input事件中转变为在change事件中同步数据
    

    v-model.number:

      可以将输入转换为Number类型
    

    v-model.trim:

      可以自动过滤输入的首尾空格
    

Demo

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <script src="../lesson2/node_modules/vue/dist/vue.min.js"></script>
</head>
<body>
  <div id="app">
    <div>
      <ul>
        <li v-for="(item, index) in myList" :key = "item.name">{{item.name}}</li>
        <li v-for="item in obj">{{item}}</li>
      </ul>
      <button @click = "addList">添加数据</button>
    </div>
    <input type = 'radio' name = "radio" value = "1" v-model = "param"><label for= "">苹果</label>
    <input type = 'radio' name = "radio" value = "2" v-model = "param"><label for= ""></label>
    <p>{{param}}</p>
    <label for="">
      <input type="checkbox" v-model = "checkVal" :true-value = "trueValue" :false-value = "falseValue">
      {{checkVal}}

    </label>
    <select name="" id="" v-model = "selected" multiple>
      <option value="1">A</option>
      <option value="2">B</option>
      <option value="3">C</option>
    </select>
    <p>{{selected}}</p>
  </div>
  <script>
    let app = new Vue({
      el: '#app',
      data: {
        myList: [
          {name: 'vue基础课程'},
          {name: 'vue进阶课程'},
          {name: 'vue高级课程'},
          {name: 'vue实战课程'},
          {name: 'vue+webpack课程'},
        ],
        obj:{
          name: "Felix",
          age: 30
        },
        param: 3,
        checkVal: '',
        trueValue: 1,
        falseValue: 2,
        selected: 1
      },
      methods:{
        addList(){
          var aa = {name: '我的学习'}
          this.myList.unshift(aa);
        }
      }
    })
  </script>
</body>
</html>
### 回答1: Vue.js 的深度 watch渲染速度的影响很大,因为它需要监听多层对象的变化,进而触发重新渲染。如果你想优化深度 watch渲染速度的影响,可以考虑以下几种方法: 1. 使用计算属性:将深度 watch 替换为计算属性,这样可以减少监听的层数。 2. 使用额外的变量:在数据变化时使用额外的变量,以减少 watch渲染速度的影响。 3. 使用 lazy:将 watch 的 deep 选项设置为 false,这样可以减少对渲染速度的影响。 4. 使用 throttle 和 debounce:通过使用 throttle 和 debounce 函数限制 watch 函数的触发频率,以减少对渲染速度的影响。 5. 尽量避免使用深度 watch:在项目设计时,尽量避免使用深度 watch,以提高渲染速度。 ### 回答2: 在优化Vue.js的深度watch以提高渲染速度方面,可以采取以下几个措施: 1. 减少深度watch的数据量:深度watch会对指定的数据进行递归监听,当数据变化时会触发重新渲染,对于大规模的数据结构或复杂的嵌套数据,深度watch可能会导致渲染速度下降。因此,在编写代码时尽量避免使用过多的深度watch,可以通过拆分数据结构,只对必要的数据进行监听。 2. 使用计算属性替代深度watchVue.js提供了计算属性的功能,通过计算属性可以根据依赖的数据自动更新结果,而不需要手动监听数据的变化。相比深度watch计算属性可以更灵活地控制渲染的时机,避免不必要的渲染,从而提高渲染速度。 3. 利用缓存的深度watch结果:对于一些计算量较大的深度watch,可以通过缓存其结果来减少重复的计算,从而提高渲染速度。Vue.js可以通过设置computed属性的缓存标志来实现,缓存结果后,只有在依赖数据变化时才会重新计算,否则直接从缓存读取结果。 4. 使用异步更新:在某些情况下,深度watch可能会导致大量的数据变化引发连续的渲染,从而降低渲染效率。可以通过Vue.js提供的$nextTick方法,在下一个DOM更新循环异步地更新渲染结果,这样可以将多次渲染合并为一次,提高渲染速度。 总而言之,优化Vue.js的深度watch可以通过减少数据量、使用计算属性、利用缓存和使用异步更新等措施来提高渲染速度,从而提升用户体验。 ### 回答3: Vue.js 是一款非常流行的前端框架,它的深度监视(deep watch)功能可以让我们方便地追踪数据的变化并及时更新界面。然而,深度监视也可能会影响渲染速度,特别是在数据量较大或嵌套层次较深的情况下。 为了优化深度监视对渲染速度的影响,我们可以采取以下几个措施: 1. 减少深度监视的范围:只监视真正需要监视的数据,而不是整个对象。可以使用计算属性来处理部分数据,只在需要时重新计算。 2. 使用惰性计算:通过使用 Vue 的 `lazy` 选项,在绑定时不立即计算数据,而是等到数据被使用时再进行计算。 3. 使用 debounce 或 throttle:如果数据更新频繁,我们可以使用 debounce(防抖动)或 throttle(节流)机制来限制监视的频率,减少不必要的渲染。 4. 使用 v-once 指令:对于那些不会改变的数据或界面,可以使用 v-once 指令来避免重复渲染。 5. 使用虚拟列表:如果存在大量列表数据需要渲染,可以考虑使用虚拟列表技术,只渲染当前可见区域的数据,而不是全部数据。 6. 使用 shouldComponentUpdate:在 Vue 3.0 ,可以使用 `shouldUpdateComponent` 钩子来手动控制组件是否需要重新渲染。可以根据具体情况进行优化,避免不必要的渲染。 通过以上优化措施,我们可以减少深度监视对渲染速度的影响,提高 Vue.js 应用的性能和用户体验。同时,也需要根据具体情况进行权衡和测试,以找到最合适的优化方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值