• 【Vue基础二】--- 计算属性,watch,style,class,条件列表渲染


    1-1 计算属性与监听

    只要data中的数据发生变化,vue一定会重新解析模板

    1-1-1 计算属性-computed

    只考虑读取,不考虑修改时,可以简写computed

    1. 计算属性:

      • 定义: 要用的属性不存在,要通过已有属性计算得来
    2. 原理:底层借助了Object.defineProperty方法提供的getter和setter

    3. get函数什么时候执行:

      • 初始化读取会执行一次
      • 当依赖的数据发生变化时会被再次调用
    4. 优势: 与methods实现相比,内部有缓存机制,效率更高

    5. 备注:

      • 计算属性最终会出现在vm上
      • 如果计算属性要被修改,必须写set函数求相应修改,且set中要引起计算时依赖的数据
    6. <div id="root">
             姓:<input type="text" value="张" v-model="fName"> <br> 名:
             <input type="text" value="三" v-model="lName"><br> 姓名: <span>{{fullName}}</span><br>
             <span>{{fullName}}</span><br>
             <span>{{fullName}}</span><br>
             <span>{{fullName}}</span><br>
             <!-- 只在控制台输出get一次,计算属性发生缓存 -->
         </div>
         <script>
             const vm = new Vue({
                 el: '#root',
                 data: {
                     fName: '张',
                     lName: '三'
                 },
                 computed: {
                     fullName: {
                         // get作用:有人读取fullName时,get就会被调用,且返回值作为fullName的值
                         // get什么时候调用? 1.初次读取fullName时2.所以来的数据发生变化时
                         get() {
                             console.log('get');
                             console.log(this); // 计算属性中的this指向vue实例对象
                             return this.fName + this.lName
                         },
                         // set什么时候调用?当fullName被修改时
                         set(value) {
                             console.log('set', value);
                         }
                     }
                 }
             })
         </script>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
    7. 简写:

      computed: {
         fullName() {
             
         }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
    8. vue中三个VScode的插件

      • Vue 3 Snippets

    1-1-2 监听属性-watch

    1. 监听属性watch:

      • 当被监听的属性变化时,回调函数自动调用,进行相关操作
      • 监听的属性必须存在,才能进行监听
      • 监听的两种写法:
        • new Vue时传入watch配置
        • 通过vm.$watch监听
    2.     <div id="root">
              <h2>今天天气很{{info}}</h2>
              <button @click="changeWeather">切换天气</button>
          </div>
      
      </body>
      <script>
          const vm = new Vue({
              el: '#root',
              data: {
                  isHot: true
              },
              computed: {
                  info() {
                      return this.isHot ? '炎热' : '凉爽'
                  }
              },
              methods: {
                  changeWeather() {
                      this.isHot = !this.isHot
                  }
              },
              watch: {
                  // 配置对象
                  isHot: {
                      immediate: true, // 初始化时让handler调用一下
                      // handler什么时候调用?当isHot发生改变时
                      handler(newValue, oldValue) {
                          console.log('isHot被修改了', newValue, oldValue);
                      }
                  }
              }
          }
      
      
          })
      
          vm.$watch('isHot', {
              immediate: true, // 初始化时让handler调用一下
              // handler什么时候调用?当isHot发生改变时
              handler(newValue, oldValue) {
                  console.log('isHot被修改了', newValue, oldValue);
              }
          })
      </script>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
    3. Vue的watch默认是无法检测对象内部值的改变

    1-1-2-1 深度监听
    1. 深度监视:
      • .Vue中的watch默认不检测对象内部值的改变(一层)
      • 配置deep: true可以检测对象内部值改变(多层)
    2. 备注:
      • Vue自身可以检测对象内部值的改变,但Vue提供的watch默认不可以
      • 使用watch时根据数据的具体结构,决定是否采用深度监视

    1-1-3 computed与watch

    1. 区别:

      • computed与watch之间的区别:
        • computed能完成的功能,watch都可以完成
        • watch能完成的功能,computed不一定能完成,watch可以进行异步操作
    2. 原则:

      • 所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm或组件实例对象: aaa(){}

        aaa: function(){}

      • 所有不被Vue管理的函数(定时器的回调函数、ajax的回调函数等),最好写成箭头函数

        • 这样this的指向才是vm或 组件实例对象
        • aaa()=>{}
    3. 计算属性完全靠fullName的返回值,计算属性不能开启异步任务维护属性

    1-2 style,DOM

    1-2-1

    1. 绑定样式

      • class样式:
        • class=“xxx” :xxx可以是字符串、对象、数组
        • 字符串写法适用于:类名不确定,要动态获取
        • 对象写法适用于:要绑定多个样式,个数不确定,名字也不确定
        • 数组写法适用于: 要绑定多个样式,个数确定,名字也确定,但不确定用不用
    2. style样式

      :style="{fontSize: xxx}"其中xxx是动态值
      :style="[a,b]"  其中a、b是样式对象
      
      • 1
      • 2
    3. 例子:

      <body>
          
          
          <div id="root">
              
              <div class="basic" :class="mood" @click="changeMood">{{name}}div> <br/><br/>
      
              
              <div class="basic" :class="classArr">{{name}}div> <br/><br/>
      
      
              
              <div class="basic" :class="classObj">{{name}}div> <br/><br/>
              <div class="basic" :class="{atguigu1,atguigu2}">{{name}}div> <br/><br/>
      
              
              <div class="basic" :style="{fontSize: fsize+'px';}">{{name}}div>
              <div class="basic" :style="styleObj">{{name}}div> <br/><br/>
              
              {name}}
    --> div> body> <script> new Vue({ el: '#root', data: { name: 'aaa', mood: 'normal', classArr: ['atguigu1', 'atguigu2', 'atguigu3'], classObj: { atguigu1: false, atguigu2: false, }, styleObj: { fontSize: '40px', color: 'red', backgroundColor: 'orange' }, styleObj2: { } }, methods: { changeMood() { const arr = ['happy', 'sad', 'normal'] const index = Math.floor(Math.random() * 3) this.mood = arr[index] } } }) script>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
  • 1-3 条件、列表渲染

    1-3-1 条件渲染

    1. v-if和v-show做条件渲染 :

      
      
      • 1
      • v-show:节点在,动态切换样式的显示
    2. v-if:

      • 写法:
        • v-if=”表达式“
        • v-else-if
        • v-else
      • 适用于: 切换频率低的场景
      • 特点:不展示的DOM元素直接被移除
      • 注意: 结构不能被打断
    3. v-show

      • 写法: v-show=“表达式”
      • 适用于: 切换频率较高的场景
      • 特点: 不展示的DOM元素未被移除,仅仅是使用样式隐藏掉
    4. <body>
          <div id="root">
              <h2 v-show="a">欢迎来到{{name}}h2>
              <h2 v-show="1 === 2">欢迎来到{{name}}h2>
      
              
              <h2 v-if="false">欢迎来到{{name}}h2>
      
              <h2>当前的n值是: {{n}}h2>
              <button @click="n++">点我n+1button>
      
              <div v-show="n === 1">Angulardiv>
              <div v-show="n === 2">Reactdiv>
              <div v-show="n === 3">Vuediv>
      
          div>
      
      
      
      body>
      <script>
          const vm = new Vue({
              el: '#root',
              data: {
                  name: 'aaa',
                  a: false,
                  n: 1
              }
          })
          console.log(vm);
      script>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31

    1-3-2 列表渲染

    1-3-2-1 例子
    1. <div id="root">
              <!-- 遍历数组 -->
              <h2>人员列表</h2>
              <ul>
                  <li v-for="person in persons" :key="person.id">{{person.id}}-{{person.name}}-{{person.age}}</li>
                  <li v-for="(p,index) in persons" :key="index">{{p.id}}-{{p.name}}-{{p.age}}--{{index}}</li>
      
              </ul>
              <!-- 遍历对象 -->
              <h2>汽车信息</h2>
              <ul>
                  <li v-for="(value, k) of car" :key="k">{{k}}-{{value}}</li>
              </ul>
      
              <!-- 遍历字符串 -->
              <h2>遍历字符串</h2>
              <ul>
                  <li v-for="(number,index) of str" :key="index">
                      {{index}}-{{number}}
                  </li>
              </ul>
          </div>
          <script>
              new Vue({
                  el: '#root',
                  data: {
                      persons: [{
                          id: '001',
                          name: '张三',
                          age: 18
                      }, {
                          id: '002',
                          name: '张四',
                          age: 19
                      }, {
                          id: '003',
                          name: '王五',
                          age: 20
                      }, ],
                      car: {
                          name: '奥迪A8'
                      },
                      str: 'hello'
                  }
              })
          </script>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
    1-3-2-2 key的原理
    • 对生成的DOM树进行破坏顺序的操作,key值对应的节点发生变化,需要重新生成虚拟DOM并渲染真实DOM
    • 没有写key,就会自动将索引值作为key值;无法识别唯一值
    1. index为keyimage-20220715120917122

    2. id为key

      image-20220715121149248

    3. 虚拟DOM中key的作用

      • key是虚拟DOM对象的标识,当状态中的数据发生变化时,Vue会根据【新数据】生成【新的虚拟DOM】
      • 随后Vue进行【新虚拟DOM】与【旧虚拟DOM】的差异比较
    4. 对比规则:

      • 旧虚拟DOM中找到了与新虚拟DOM相同的key
        • 若虚拟DOM中内容没变,直接使用之前的真实DOM
        • 若虚拟DOM中内容变了,则生成新的真实DOM,随后替换掉页面中之前的真实DOM
      • 旧虚拟DOM中未找到与新虚拟DOM相同的key
        • 创建新的真实DOM,随后渲染到页面
    5. 用index作为key可能会引发的问题:

      • 若对数据进行: 逆序添加、逆序删除等破环顺序操作: 会产生没有必要的真实DOM更新==> 界面效果没问题,但效率低
      • 如果结构中还包含输入类的DOM: 会产生错误DOM更新==>界面有问题
    6. 开发中如何选择key:

      • 最好使用每条数据的唯一标识作为key,比如 id、手机号、身份证号、学号等唯一值
      • 如果不存在对数据的逆序添加、逆序删除等破坏顺序操作,仅用于渲染列表用于展示,使用index作为key是没有问题的
    1-3-2-3 列表过滤

    见下节

    1-3-2-4 列表过滤+排序

    见下节

  • 相关阅读:
    pytorch初学笔记(六):DataLoader的使用
    记一次升级maven的坑(idea 2021.3.2; maven3.5.0升级3.8.5)
    linux服务器在没有网的条件下,怎么安装使用numpy呢
    PMP扫盲篇2 | PMP报名、缴费、考试那些事儿~~
    第四章:指令系统
    【Python百日刷题计划】Day12~填空和编程题练习
    数学建模学习(98):CHIO优化算法
    分享一个追剧神器(不是看剧),可以追电视剧、动漫和电影
    14 C++设计模式之策略(Strategy)模式
    Thinkphp6实现定时任务功能
  • 原文地址:https://blog.csdn.net/hannah2233/article/details/126879485