首页 > 其他分享 >v-mode和v-for和虚拟dom和v-bind对于class增强,computed计算属性和watch属性侦听器

v-mode和v-for和虚拟dom和v-bind对于class增强,computed计算属性和watch属性侦听器

时间:2023-01-04 16:11:45浏览次数:45  
标签:key return computed dom bind 计算 属性

v-mode双向数据绑定(重点)

基本使用:给表单元素使用,双向数据绑定

(1)当数据变化了,视图也会跟着变化

(2)视图变化了,数据也会跟着变化(输入框内容变化了(监听用户的输入,监听input事件),数据也要跟着变化)

语法:v-model = ‘值’

<input type="text" v-model="msg">

注意点:当v-model处理其他表单元素的时候,v-model会忽略掉表单元素原本的value,checked等初始值

v-model的修饰符

v-model.number,将用户的输入的值转换为数字类型

v-model.trim,自动过滤掉用户输入的首位空白字符

v-lazy,在change时而非input时过呢更新数据,v-model默认情况下,当我们输入完毕,vue就会获取的表单输入框中的数据,但是修改以后,是我们失去焦点的时候,vue会获取到表单输入框中的数据

<template>
  <div>
    <button @click="dian">点击获取输入框中的最新的值</button>
    <input type="text" name="" id="" v-model.lazy="count">
    <hr>
    <input type="checkbox" name="" id="1" v-model="flag">
    <h3>{{flag === true ? `选中`:`未选中`}}</h3>
    <hr>
    <input type="radio" name="" id="" value="1" v-model="check"> 男性
    <input type="radio" name="" id="" value="2" v-model="check"> 女性
    <button @click="dianji">点击提交</button>
    <hr>
    <input type="radio" name="" id="" v-model="card" value="1"> 身份证
    <input type="radio" name="" id="" v-model="card" value="2"> 护照
    <input type="radio" name="" id="" v-model="card" value="3"> 学生证
    <input type="radio" name="" id="" v-model="card" value="4"> 驾驶证
    <input type="radio" name="" id="" v-model="card" value="0"> 其他
    <button @click="tijiao">点击提交</button>
  </div>
</template>

<script>
export default {
  name: "v-model",
  data () {
    return {
      flag : true,
      count : `10`,
      check : true,
      card : true
    }
  },
  methods : {
    dian () {
      // 点击提交的时候,希望获取到输入框中最新的数值
      console.log(this.count)
      // 我们输入完以后想到获取到number型
      console.log(Number(this.count))
    },
    dianji() {
      console.log(this.check)
    },
    tijiao() {
      console.log(this.card)
    }
  }
}
</script>

v-for(遍历)

基本使用:遍历对象和数组,通常用来遍历数组

<template>
<!--v-for循环,作用进行遍历的,数组,对象,数字-->
<!--  for循环的时候必须添加一个key,这里的key最好是数据的唯一标识-->
<!--  如果没有唯一标识,可以使用所用引号(不写key会报错),但是不推荐索引号-->
<div class="box">
  <ul>
    <li v-for="(item,index) in arr" :key="index">数组的值:{{item.title}} 数组的索引:{{index}}</li>
  </ul>
  <hr>
  <h3>渲染王路飞信息</h3>
  <ul v-for="(value,key) in obj">
    <li>对象的值:{{value}} 对象的键{{key}}</li>
  </ul>
  <hr>
  <ul>
    <li v-for="(item,index) in number">这个是字符串中的每一个值:{{item}} 这个是索引:{{index}}</li>
  </ul>
</div>
</template>
<script>
export default {
  name: "07-v-for循环",
  data () {
    return {
      // 遍历数字
      number : `12345678`,
      // 遍历对象
      obj : {name : `王路飞`, age : `18`, msg : `尼卡果实`,},
      // 遍历数组
      arr : [
        {id : 0, title : `学习`,},
        {id : 1, title : `学习1`,},
        {id : 2, title : `学习2`,},
        {id : 3, title : `学习3`,},
        {id : 4, title : `学习4`,},
        {id : 5, title : `学习5`,},
      ]
    }
  }
}
</script>

虚拟dom和diff算法(可以修改原数组的7种方法)

什么叫做虚拟dom:

概念:虚拟dom本质上是一个js对象,用于描述真实的dom结构

数据跟更新的时候,根据老的虚拟dom结构和新的虚拟dom结构,进行对比,找出差异(需要更新的地方),真实的更新到dom结构里面(打补丁)

使用索引号当作key值,当添加到首位的时候,会把所有的dom节点重新创建一次

为什么使用唯一key值:

当我们使用唯一key值得时候,新旧虚拟dom会对比key值,只更新创建的key值,会最小化的更新dom

使用v-for的时候,如果添加了key为当前的数据的唯一标识的时候,domdiff的时候,就能找到可以复用的元素,最小化的dom更新

对比虚拟dom的算法叫做diff算法

key值的要求是

字符串或者数值,唯一不能有重复

有唯一id使用唯一id,没有唯一id的时候使用索引,使用索引只能让页面没有报错,不能解决唯一key值得问题,更新得时候会对比索引,会出现错误显示

唯一key得好处:提高虚拟dom得对比复用性能,只要是写列表渲染的时候,都推荐添加key属性,且key推荐使用id,索引号添加以后只能解决报错,不能解决唯一id值

diff算法:

策略1:

先同层级根元素比较,如果根元素变化,那么步考虑复用,整个dom树删除重建

先同层级根元素比较,吐过根元素不变,对比出属性得变化更新,并考虑往下递归复用

策略2:

对比同级兄弟元素时,默认按照下标进行对比复用

对比同级兄弟元素时,如果指定了唯一key值,就会按照相同key元素进行对比

<template>
<div>
  <ul>
    <li v-for="(item,index) in arr">{{item}}</li>
  </ul>
  <button @click="aa">修改数组元素</button>
  <button @click="bb">修改数组元素</button>
</div>
</template>
<script>
// 可以改变原数组的7种方法
// push(),pop(),shift(),unshift(),splice(),sort(),reverse(),
// vue提供的可以修改数组某一项的方法$set(需要修改的数组,索引,数值)
export default {
  name: "08-vue中的数组方法",
  data () {
    return {
      arr : [4,5,7,6,8,9]
    }
  },
  // 修改了数组,界面就是响应式更新
  methods : {
    aa () {
      this.arr.push(this.arr[0])
      // 删除掉第一项
      this.arr.shift()
    },
    bb () {
      this.$set(this.arr,1,100)
    }
  }
}
</script>

 样式处理:v-bind对于class得增强和v-bind对于style增强

v-bind对于类型操作的增强,注意点:class不会影响到原来的class属性

作用:设置动态属性,针对class和style进行增强

允许使用对象或者数组,对象如果键值对的值为true,那么就会有这个属性,如果时false就没有这个属性,数组:数组种所有的类都会添加到盒子上

v-bind绑定class

<template>
<div>
<div :class="{ red:show }" >时不我待</div>
<div :class="{ orange:orange }" @click="bb">学而时习之</div>
<button @click="show = !show" >点击切换红色</button>
<button @click="bb" >点击切换橙色</button>
<div :class="classs">添加classs多个数组样式</div>
</div>
</template>

<script>
export default {
data(){
return {
show : true,
orange : true,
classs : [`a`,`b`,`c`,`d`]
}
},
methods : {
bb () {
this.orange = !this.orange
},
}
}
</script>

<style scoped>
.red {
color: red;
}
.orange {
color: orange;
}
</style>

v-bind绑定style样式

<template>
  <div>
    <div :style="mainStyle">时不我待</div>
    <br>
    <div :style="[otherStyle,mainStyle]">路漫漫其修远兮</div>
  </div>
</template>
<script>
export default {
  name: "10-动态绑定style",
  data () {
    return {
      mainStyle : {
        color : `red`,
        fontSize : `20px`,
        fontWeight : `bold`,
      },
      otherStyle : {
        background : `pink`
      }
    }
  }
}
</script>

computed定义计算属性

作用:我们根据已有的属性值,计算出来我们需要的属性值,就会使用到计算属性

使用computed定义计算属性:

定义的计算属性需要时一个函数,返回一个计算结果,return出来一个返回值

计算属性,只有它所依赖的属性值发生变化的时候,才会重新进行计算

总结:computed和methods的区别

methods:只要当前组件的任何数据有更新,methods肯定要重新执行一次

computed:当前的组件有数据更新的时候,但是当前依赖的属性值没有更新的时候,就不会进行重新更新

计算属性的特点,计算属性计算的值,可以进行缓存

计算属性只要计算一次,就会把结果缓存起来,以后多次使用计算属性,直接调用的是缓存结果,并且只计算一次

计算属性所依赖的属性值,一旦发生了变化,计算属性就会重新计算一次,并且进行缓存

计算属性依赖的值是什么?计算属性所依赖的数据。也就是说计算属性中所依赖的数据进行了变更才会更新数据

<template>
  <div>
    Number1 <input type="text" name="" id="1" v-model.number="one">
    Number2 <input type="text" name="" id="2" v-model.number="two">
    <h2>总和{{he}}{{he}}{{he}}{{he}}{{he}}</h2>
    <h2>methods求出总和{{zonghe()}}{{zonghe()}}{{zonghe()}}{{zonghe()}}</h2>
    <h2>数组的累加和{{Arr}}</h2>
  </div>
</template>
<script>
export default {
  data () {
    return {
      one : ``,
      two : ``,
      arr : [1,3,4,6,7,9]
    }
  },
  computed : {
    he () {
      console.log(`computed进行调用了`) // computed每次调用只调用了一次
      return this.one + this.two
    },
    Arr () {
      return this.arr.reduce((p,i) => {return p + i},0)
    }
  },
  methods : {
    zonghe () {
      console.log(`methods进行调用了`) // methods调用,使用一次这个方法我们就会调用一次
      return this.one + this.two
    }
  }
}
</script>

computed计算属性的两种写法

computed计算属性的最大特点就是有缓存

使用场景:我们对现有的属性值进行计算,求出新的属性值

什么时候会开始进行计算,当computed依赖的数据发生改变的时候会进行重新计算,并且缓存新的计算的属性值

如果页面使用到多次同一个计算属性,不会进行多次计算直接使用缓存的属性值

当我们的计算属性被修改了,不可以,默认情况下,计算属性是不可以被修改的,如果被修改了会报错

报错内容:计算属性被修改了,但是没有提供对应的setter方法

所以我们使用到computed计算属性的第二种写法,不仅可以获取值,还可以修改计算属性

方法:计算属性写成一个对象,并且为他提供get和set方法

get方法用于计算当前的计算属性的值

set方法当修改计算属性的值得时候会触发,可以通过修改形参获取到修改之后得最新得值

<template>
<div>
<input type="text" name="" id="1" v-model.number="one" placeholder="加一前得数据">
<input type="text" name="" id="2" v-model.number="two" placeholder="加一后得数据">
</div>
</template>
<script>
export default {
data () {
return {
one : ``
}
},
computed : {
two : {
get () { //get方法就是获取到已有数据计算得结果
return this.one + 1
},
set (value) { //set方法可以对计算结果进行修改并且不会报错,value是获取到得计算结果
return this.one = value - 1
}
}
}
}
</script>

watch属性侦听器

computed计算属性

作用:根据已有得属性,进行计算得出计算属性,注意点计算属性里面不能有异步操作

watch属性侦听器

作用:监听现有属性的变化,当属性发生变化以后做一些其他的操作。监听现有的属性的变化,做一些其他操作

默认情况下watch首次是不会执行监听的

需要watch首次执行监听使用 immediate : true

默认监听的是复杂数据类型地址是否发生变化,属性侦听器,默认情况下监听的都是普通数据类型,如果想要监听复杂数据类型。deep:true

开启深度监听以后,不管他内部的任何属性发生了变化,我们都可以监听到

特性:可以进行异步操作

<template>
  <div>
    <input type="text" name="" id="1" v-model.number="one" placeholder="我们想要监听数据">
    <input type="text" name="" id="1" v-model.number="obj.name" placeholder="我们想要监听的对象数据">
  </div>
</template>
<script>
export default {
  data () {
    return {
      one  : ``,
      obj : {
        name : ``
      }
    }
  },
  watch : {
    one (newOne,oldOne) {
      console.log(`普通数据:新的属性:${newOne}`)
      console.log(`普通数据:旧的属性:${oldOne}`)
    },
    obj : {
      handler (newName,oldName) {
        console.log(`对象:新的属性:${newName}`)
        console.log(`对象:旧的属性:${oldName}`)
      },
      immediate : true, //开启首次监听
      deep : true  //进行深度监听,监听到对象内部数据的变化
    }
  }
}
</script>

  

标签:key,return,computed,dom,bind,计算,属性
From: https://www.cnblogs.com/hgng/p/17024330.html

相关文章