【Vue】Vue的核心

目录

  • 计算属性-computed
    • 插值语法实现
    • methods实现
    • 计算属性实现
      • 使用
      • 使用总结:
  • 监视属性-watch
    • 监视的两种写法:
    • 深度监视
      • 备注:
    • computed和watch之间的区别
  • 绑定样式
    • class样式绑定
      • 字符串写法
      • 数组写法
      • 对象写法
  • style样式绑定
    • 对象式1
    • 对象式2
    • 数组式
  • 条件渲染
    • v-if 与 v-else
      • 写法:
      • 使用场景
      • 特点
      • 案例
    • v-show
      • 写法
      • 使用场景
      • 特点
      • 案例
    • 总结
      • 比较 v-if 与 v-show
  • 列表渲染
    • v-for的基本使用
      • 语法
      • 使用
      • 案例
    • key的原理
    • 面试题(key的内部原理)
      • 虚拟DOM中key的作用:
      • 对比规则:
      • 用index作为key可能会引发的问题
      • 开发中如何选择key?
      • 案例展示
  • 列表过滤
    • 用computed实现(推荐):
    • 用watch实现(比较麻烦)
  • 列表排序
    • 实现思路
    • 补充
  • 收集表单数据
  • 过滤器(filter)
    • 语法:
    • 备注:v-model的三个修饰符:

计算属性-computed

插值语法实现

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue初体验</title><!-- 1.引入Vue --><script src="../js/vue.js"></script>
</head>
<body><!-- 2.准备一个容器 --><div id="root"><p>姓:<input type="text" v-model="frontName"></p><p>姓:<input type="text" v-model="afterName"></p><p>全名:{{frontName}}-{{afterName}}</p><p>全名:{{frontName + '-' + afterName}}</p></div><script>//3.创建Vue实例const vm = new Vue({el:'#root',data:{frontName:'张',afterName:'三',}});</script>
</body>
</html>

methods实现

  • 原理:每当数据发生变化,和其相关的模板函数要重新解析(无关的不会解析)
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue初体验</title><!-- 1.引入Vue --><script src="../js/vue.js"></script>
</head>
<body><!-- 2.准备一个容器 --><div id="root"><p>姓:<input type="text" v-model="frontName"></p><p>姓:<input type="text" v-model="afterName"></p><p>全名:{{fullName()}}</p><!-- fullName()方法名带括号表示使用的是方法的返回值 --><p>全名:{{fullName()}}</p><!-- fullName()方法名带括号表示使用的是方法的返回值 --><p>全名:{{fullName()}}</p><!-- fullName()方法名带括号表示使用的是方法的返回值 --></div><script>//3.创建Vue实例const vm = new Vue({el:'#root',data:{frontName:'张',afterName:'三',},methods:{fullName(){console.log('fullName');return this.frontName + '-' +  this.afterName;}}});</script>
</body>
</html>
  • 缺点: 每次与fullName()相关的变量发生变动时,fullName()都会变化
    在这里插入图片描述

计算属性实现

  • vue将data中的数据视为属性

使用

  1. 定义: 要用的属性不存在,要通过已有属性(Vue实例中的属性)计算得来, 使用let或者 var定义的变量无法被vue实例监听到

  2. 原理: 底层借助了Object.defineproperty方法提供的getter和setter

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

    初次读取时会执行一次
    当依赖的数据发生改变时会被再次调用

  4. 优势: 与methods实现相比,内部有缓存机制(复用),效率更高,调试方便

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue初体验</title><!-- 1.引入Vue --><script src="../js/vue.js"></script>
</head>
<body><!-- 2.准备一个容器 --><div id="root"><p>姓:<input type="text" v-model="frontName"></p><p>姓:<input type="text" v-model="afterName"></p><p>全名:{{fullName}}</p><p>全名:{{fullName}}</p><p>全名:{{fullName}}</p></div><script>//3.创建Vue实例const vm = new Vue({el:'#root',data:{frontName:'张',afterName:'三',},computed:{fullName:{get(){console.log('get被调用了')console.log(this)return this.frontName + '-' + this.afterName;},set(value){console.log('set被调用了:',value)const arr = value.split('-');this.frontName = arr[0];this.afterName = arr[1];}}}});</script>
</body>
</html>

在这里插入图片描述

  • 多数情况下计算属性只考虑读取,不考虑修改,因此可以把set部分去掉,直接以函数式写法使用即可
        computed:{fullName(){return this.frontName + '-' + this.afterName;}}

使用总结:

  1. 要显示的数据不存在,要通过计算得来。
  2. 在 computed 对象中定义计算属性。
  3. 在页面中使用{{方法名}}来显示计算的结果

监视属性-watch

  1. 通过通过vm对象的$watch()或watch配置来监视指定的属性
  2. 当属性变化时, 回调函数自动调用, 在函数内部进行计算
  3. 当被监视的属性变化时, 回调函数自动调用(watch中调用的handler函数), 进行相关操作
  4. 监视的属性必须存在,才能进行监视!!

监视的两种写法:

  1. new Vue时传入watch配置

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>Vue初体验</title><!-- 1.引入Vue --><script src="../js/vue.js"></script>
    </head>
    <body><!-- 2.准备一个容器 --><div id="root"><h1>今天天气很{{info}},{{x}}</h1><button @click="isHot = !isHot,x++">切换</button><button @click="change">+</button></div><script>//3.创建Vue实例const vm = new Vue({el:'#root',computed:{info(){return this.isHot ? '炎热' : '寒冷';}},data:{isHot:true,x:0},methods:{change(){this.isHot = !this.isHot;this.x++;}},watch:{isHot(newValue,oldValue){console.log(newValue,oldValue);}}});</script>
    </body>
    </html>
    
  2. 通过vm.$watch监视

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>Vue初体验</title><!-- 1.引入Vue --><script src="../js/vue.js"></script>
    </head>
    <body><!-- 2.准备一个容器 --><div id="root"><h1>今天天气很{{info}},{{x}}</h1><button @click="isHot = !isHot,x++">切换</button><button @click="change">+</button></div><script>//3.创建Vue实例const vm = new Vue({el:'#root',computed:{info(){return this.isHot ? '炎热' : '寒冷';}},data:{isHot:true,x:0},methods:{change(){this.isHot = !this.isHot;this.x++;}},/*watch:{isHot(newValue,oldValue){console.log(newValue,oldValue);}}*/});vm.watch('isHot',function(newValue,oldValue){console.log(newValue,oldValue);})</script>
    </body>
    </html>
    

深度监视

  1. Vue中的watch默认不监测对象内部值的改变(针对引用值只监听一层)。
  2. 配置deep:true可以监测对象内部值改变(多层)。
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue初体验</title><!-- 1.引入Vue --><script src="../js/vue.js"></script>
</head>
<body><!-- 2.准备一个容器 --><div id="root"><h1>a的值是:{{numbers.a}}</h1><button @click="numbers.a++">a+1</button><h1>b的值是:{{numbers.b}}</h1><button @click="numbers.b++">b+1</button><h1>e的值是:{{numbers.c.d.e}}</h1><button @click="numbers.c.d.e++">e+1</button></div><script>//3.创建Vue实例const vm = new Vue({el:'#root',data:{numbers:{a:1,b:2,c:{d:{e: 100}}}},watch:{numbers: {deep: true,// 开启深度监听handler(newValue, oldValue){console.log('numbers改变啦!');}}}});</script>
</body>
</html>

备注:

  1. Vue自身可以监测对象内部值的改变,但Vue提供的watch默认不可以!
  2. 使用watch时根据数据的具体结构,决定是否采用深度监视。

computed和watch之间的区别

  • computed能完成的功能,watch都可以完成。
  • watch能完成的功能,computed不一定能完成
    • 例如:watch可以进行异步操作,computed不可以。
      • 因为computed依赖返回值得到结果,而watch则是得到属性改变的结果
    • 例:让名字延迟1s再打印
      • watch能够实现:本质是watch无需通过一个返回值来实现任务,watch是通过让你自己执行代码来实现数据修改
      • couputed不能实现:本质计算属性的实现重要的是返回值,我们无法做到等一会儿再返回一个值(异步)

两个重要的小原则:

  • 所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm 或 组件实例对象。
  • 所有不被Vue所管理的函数(定时器的回调函数、ajax的回调函数等、Promise的回调函数),最好写成箭头函数,这样this的指向才是vm 或 组件实例对象。

绑定样式

  • 在应用界面中, 某个(些)元素的样式是变化的
  • class/style 绑定就是专门用来实现动态样式效果的技术
  • 绑定样式方式:
    • class样式绑定
    • sytle样式绑定

class样式绑定

  • 常规写法:class = ‘class1 class2’
  • v-bind 写法::class=“xxx” xxx可以是字符串、对象、数组
    • 字符串写法适用于:类名不确定,要动态获取,如 :class=“mood”
    • 数组写法适用于:要绑定多个样式,个数确定,名字也确定,但不确定用不用,如 :class=“[‘yk1’, ‘yk2’, ‘yk3’]”
    • 对象适用于:要绑定多个样式,个数确定,名字也确定,但是需要动态决定用不用,如 :class=“{ yk1: true,yk2: false,yk3: true}”

字符串写法

  • 表达式是字符串: ‘classA’ 适用于:类名不确定,要动态获取
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue初体验</title><!-- 1.引入Vue --><script src="../js/vue.js"></script><style>.basic{width: 200px;height: 200px;}.normal{background-color: skyblue;}.happy{background-color: green;}.sad{background-color: gray;}</style>
</head>
<body><!-- 2.准备一个容器 --><div id="root"><div class="basic" :class="mood" @click="changeMood">{{name}}</div></div><script>//3.创建Vue实例const vm = new Vue({el:'#root',data:{name:'Vue',mood: 'normal'},methods:{changeMood(){const arr = ['normal', 'happy', 'sad'];const index = Math.floor(Math.random() * 3)//取0-3的随机数this.mood = arr[index];}}});</script>
</body>
</html>

数组写法

  • 表达式是数组: [‘classA’, ‘classB’] 适用于要绑定多个样式,个数确定,名字也确定,但不确定用不用
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue初体验</title><!-- 1.引入Vue --><script src="../js/vue.js"></script><style>.basic{width: 200px;height: 200px;}.c1{background-color: yellowgreen;}.c2{font-size: 30px;color: blue;}.c3{border: 1px solid red;border-radius: 20px;}</style>
</head>
<body><!-- 2.准备一个容器 --><div id="root"><div class="basic" :class="classArr">{{name}}</div><button @click="changeStyle">改变样式</button></div><script>//3.创建Vue实例const vm = new Vue({el:'#root',data:{name:'Vue',classArr: ['c1', 'c2']},methods:{changeStyle(){this.classArr.push('c3');this.classArr.splice(1, 1)//删除c2}}});</script>
</body>
</html>

对象写法

  • 表达式是对象: {classA:isA, classB: isB} 适用于要绑定多个样式,个数确定,名字也确定,但是需要动态决定用不用
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue初体验</title><!-- 1.引入Vue --><script src="../js/vue.js"></script><style>.basic{width: 200px;height: 200px;}.c1{background-color: yellowgreen;}.c2{font-size: 30px;color: blue;}.c3{border: 1px solid red;border-radius: 20px;}</style>
</head>
<body><!-- 2.准备一个容器 --><div id="root"><div class="basic" :class="classObj">{{name}}</div><button @click="changeStyle">改变样式</button></div><script>//3.创建Vue实例const vm = new Vue({el:'#root',data:{name:'Vue',classObj:{c1:true,c2:false,c3:true}},methods:{changeStyle(){this.classObj.c1 = !this.classObj.c1;this.classObj.c2 = !this.classObj.c2;}}});</script>
</body>
</html>

style样式绑定

  • 基础使用 style = ‘background:red’
  • v-bind使用 :
    • 对象:
      • :style = "{backgroundColor: 'orange'}"
      • :style="{ color: activeColor, fontSize: fontSize + 'px' }"
      • 其中 activeColor/fontSize 是 data 属性
    • 数组(用的很少): :style = '[{backgroundColor: 'orange'},{color: 'red'}]'

对象式1

:style = "{backgroundColor: 'orange'}"

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue初体验</title><!-- 1.引入Vue --><script src="../js/vue.js"></script><style>.basic{width: 200px;height: 200px;}</style>
</head>
<body><!-- 2.准备一个容器 --><div id="root"><div class="basic" :style="style1">{{name}}</div></div><script>//3.创建Vue实例const vm = new Vue({el:'#root',data:{name:'Vue',style1: {fontSize: '40px',color: 'red'},style2: {backgroundColor: 'orange',}},});</script>
</body>
</html>

对象式2

:style="{ color: activeColor, fontSize: fontSize + 'px' }"

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue初体验</title><!-- 1.引入Vue --><script src="../js/vue.js"></script><style>.basic{width: 200px;height: 200px;}</style>
</head>
<body><!-- 2.准备一个容器 --><div id="root"><div class="basic" :style="{color:fontColor,fontSize:size + 'px'}">{{name}}</div></div><script>//3.创建Vue实例const vm = new Vue({el:'#root',data:{name:'Vue',fontColor: 'orange',size: 30},});</script>
</body>
</html>

数组式

:style = '[{backgroundColor: 'orange'},{color: 'red'}]'

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue初体验</title><!-- 1.引入Vue --><script src="../js/vue.js"></script><style>.basic{width: 200px;height: 200px;}</style>
</head>
<body><!-- 2.准备一个容器 --><div id="root"><div class="basic" :style="styleArr">{{name}}</div></div><script>//3.创建Vue实例const vm = new Vue({el:'#root',data:{name:'Vue',styleArr:[{width:'200px',height:'200px',background:'red',},{fontSize:'20px',color:'blue',}]},});</script>
</body>
</html>

条件渲染

v-if 与 v-else

写法:

  1. v-if=“表达式”
  2. v-else-if=“表达式”
  3. v-else=“表达式”

使用场景

  • 切换频率较低的场景。

特点

  • 不展示的DOM元素直接被移除。

案例

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue初体验</title><!-- 1.引入Vue --><script src="../js/vue.js"></script>
</head>
<body><!-- 2.准备一个容器 --><div id="root"><h1>当前n的值是:{{n}}</h1><button @click="n++">n+1</button><button @click="n--">n-1</button><!-- 浏览器F12查看源码 --><p v-if="n === 1">百度</p><p v-if="n === 2">360</p><p v-if="n === 3">谷歌</p><hr><p v-if="n === 1">诺克萨斯</p><p v-else-if="n === 2">艾欧尼亚</p><p v-else-if="n === 3">皮尔特沃夫</p><p v-else>德玛西亚</p></div><script>//3.创建Vue实例const vm = new Vue({el:'#root',data:{name:'百度',n:0,},});</script>
</body>
</html>

v-show

写法

  • v-show=“表达式”

使用场景

  • 切换频率较高的场景。

特点

  • 不展示的DOM元素会将display属性设置为none。

案例

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue初体验</title><!-- 1.引入Vue --><script src="../js/vue.js"></script>
</head>
<body><!-- 2.准备一个容器 --><div id="root"><h1 v-show="isShow">{{name}}</h1><button @click="isShow = !isShow">切换</button></div><script>//3.创建Vue实例const vm = new Vue({el:'#root',data:{name:'百度',isShow: true},});</script>
</body>
</html>

总结

  • v-if可以和:v-else-if、v-else一起使用,但要求结构不能被“打断”。
  • v-if可以搭配template使用,不影响页面布局(注意和v-show使用 v-show会失效)
  • 使用v-if的时,元素可能无法获取到,而使用v-show一定可以获取到

比较 v-if 与 v-show

  1. 如果需要频繁切换 v-show 较好
  2. 当条件不成立时, v-if 的所有子节点不会解析(项目中使用)

列表渲染

v-for的基本使用

  • 用于展示列表数据

语法

  • v-for="(item, index) in xxx" :key=“yyy”

使用

  • 可遍历:数组、对象、字符串(用的很少)、指定次数(用的很少)
  • v-for 指令需要使用 item in items 形式的特殊语法,其中 items 是源数据数组,而 item 则是被迭代的数组元素的别名(形参)。
  • v-for 还支持一个可选的第二个参数,即当前项的索引。
  • 可以用 of 替代 in 作为分隔符,因为它更接近 JavaScript 迭代器的语法:
    • 数组: (item, index)
    • 对象: (value, key)
    • 字符串:(char, index)
    • 数字:(number, index)

案例

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue初体验</title><!-- 1.引入Vue --><script src="../js/vue.js"></script>
</head>
<body><!-- 2.准备一个容器 --><div id="root"><h1>数组遍历</h1><table cellpadding="0" cellspacing="0" border="1"><thead><th width="100px">ID</th><th width="100px">姓名</th><th width="100px">年龄</th></thead><tr v-for="(p,index) in persons" :key="p.id" align="center"><td>{{p.id}}</td><td>{{p.name}}</td><td>{{p.age}}</td></tr></table><h1>对象遍历</h1><ul><li v-for="(value,key) in cars" :key="key">{{key}}:{{value}}</li></ul><h1>字符串遍历</h1><ul><li v-for="(value,index) in words" :key="index">{{value}}</li></ul><h1>数字遍历</h1><ul><li v-for="(value,index) in 10" :key="index">{{value}}</li></ul></div><script>//3.创建Vue实例const vm = new Vue({el:'#root',data:{persons:[{id:1,name:'张三',age:18},{id:2,name:'李四',age:19},{id:3,name:'王五',age:20},],cars: {id:1,name:'奔驰',price:100000,color:'黑色'},words: 'Hello Vue'},});</script>
</body>
</html>

key的原理

  • 有相同父元素的子元素必须有独特的 key。重复的 key 会造成渲染错误

面试题(key的内部原理)

虚拟DOM中key的作用:

是虚拟DOM对象的标识,当数据发生变化时,Vue会根据【新数据】生成【新的虚拟DOM】,
随后Vue进行【新虚拟DOM】与【旧虚拟DOM】的差异比较,

对比规则:

  • 旧虚拟DOM中找到了与新虚拟DOM相同的key:
    • 若虚拟DOM中内容没变, 直接使用之前的真实DOM!
    • 若虚拟DOM中内容变了, 则生成新的真实DOM,随后替换掉页面中之前的真实DOM。
  • 旧虚拟DOM中未找到与新虚拟DOM相同的key创建新的真实DOM,随后渲染到到页面。

用index作为key可能会引发的问题

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

开发中如何选择key?

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

案例展示

列表渲染, 若key指定为index,当在li前面插入一个新的li li右侧的input输入框会发生错乱,输入框的数据会对不上号:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue初体验</title><!-- 1.引入Vue --><script src="../js/vue.js"></script>
</head>
<body><!-- 2.准备一个容器 --><div id="root"><button @click="persons.unshift({id:4,name:'赵六',age:21})">往数组的前面添加一个对象</button><p v-for="(item,index) in persons"><!-- 不写:key默认使用index渲染 --><input type="checkbox"> {{item.id}}-{{item.name}} - {{item.age}}</p><hr><p v-for="(item,index) in persons" :key="item.id"><input type="checkbox"> {{item.id}}-{{item.name}} - {{item.age}}</p></div><script>//3.创建Vue实例const vm = new Vue({el:'#root',data:{persons:[{id:1,name:'张三',age:18},{id:2,name:'李四',age:19},{id:3,name:'王五',age:20},]},});</script>
</body>
</html>

在这里插入图片描述

在这里插入图片描述

列表过滤

用computed实现(推荐):

实现思路:计算属性fillPersons的值受keyWord的值变化而变化

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue初体验</title><!-- 1.引入Vue --><script src="../js/vue.js"></script>
</head>
<body><!-- 2.准备一个容器 --><div id="root"><input type="text" v-model="keyWord"><ul><li v-for="(p,index) of filPersons" :key="index">{{p.name}} - {{p.age}}</li></ul></div><script>//3.创建Vue实例const vm = new Vue({el:'#root',computed:{filPersons(){return this.persons.filter((p)=>{return p.name.indexOf(this.keyWord) !== -1})}},data:{keyWord:'',persons:[{id:1,name:'张三',age:18,sex:'男'},{id:2,name:'李四',age:19,sex:'女'},{id:3,name:'王五',age:20,sex:'女'},{id:3,name:'赵六',age:22,sex:'男'},]},});</script>
</body>
</html>

用watch实现(比较麻烦)

实现思路:监听输入框的数据变化,使用过滤方法迭代数据,筛选数据后重新渲染li
注意indexOf()方法搜索空串会返回0,所以任何数据都会通过筛选,设置watch初始调用可解决数据第一次更新为控问题

列表排序

  • 在之前的列表的基础上添加年龄升序、降序、原序功能:

实现思路

  • 对之前过滤剩下的数据进行判断操作,
  • 计算属性的强大之处在于其内部每一个数据的改变都会触发计算属性
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue初体验</title><!-- 1.引入Vue --><script src="../js/vue.js"></script>
</head>
<body><!-- 2.准备一个容器 --><div id="root"><input type="text" v-model="keyWord"><button @click="sortType = 2 ">年龄升序</button><button @click="sortType = 1 ">年龄降序</button><button @click="sortType = 0 ">复原</button><ul><li v-for="(p,index) of filPersons" :key="index">{{p.name}} - {{p.age}}</li></ul></div><script>//3.创建Vue实例const vm = new Vue({el:'#root',computed:{filPersons(){const arr = this.persons.filter(p=>{return p.name.indexOf(this.keyWord) !== -1;});//判断是否排序if (this.sortType !== 0){arr.sort((p1,p2)=>{if(p1.age - p2.age < 0){console.log(p1.age + "小于" + p2.age + "调换位置")}else if(p1.age - p2.age > 0){console.log(p1.age + "大于" + p2.age + "位置不变")}else {console.log(p1.age + "等于" + p2.age + "位置不变")}return this.sortType === 1 ? p2.age - p1.age : p1.age - p2.age;});}return arr;}},data:{keyWord:'',sortType:0,persons:[{id:1,name:'张三',age:20,sex:'男'},{id:2,name:'李四',age:18,sex:'女'},{id:3,name:'王五',age:19,sex:'女'},{id:3,name:'赵六',age:22,sex:'男'},]},});</script>
</body>
</html>

补充

  • sort函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。
  • 比较函数应该具有两个参数 a 和 b,其返回值如下:
    • 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
    • 若 a 等于 b,则返回 0。
    • 若 a 大于 b,则返回一个大于 0 的值。

收集表单数据

  • 若:type=text、password、number,则v-model默认收集的是value值,用户输入的就是value值。
  • 若:type=radio,则v-model默认收集的是value值,因为此类型无法输入内容,则无法通过输入得到value值,所以要给标签手动添加value值。
  • 若:type=checkbox
    • 没有配置input的value属性,那么默认读取的的就是checked是否被勾选(勾选 or 未勾选,是布尔值)
    • 配置input的value属性:
      • v-model的初始值是非数组,那么收集的就是checked(勾选 or 未勾选,是布尔值)
      • v-model的初始值是数组,那么收集的的就是value组成的数组
  • 备注:v-model的三个修饰符:
    • lazy:失去焦点再收集数据
    • number:输入字符串转为有效的数字
    • trim:输入首尾空格过滤
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>初识VUE</title><!-- 1.引入VUE.js --><script src="../js/vue.js"></script></head><body><!-- 2.准备一个容器 --><div id="root"><form @submit.prevent="tijiao"><p>账号:<input type="text" v-model="userInfo.userCode"></p><p>姓名:<input type="text" v-model="userInfo.userName"></p><p>密码:<input type="password" v-model="userInfo.userPassword"></p><p>性别:<input type="radio" name="sex" v-model="userInfo.sex" value="0"><input type="radio" name="sex" v-model="userInfo.sex" value="1"></p><p>生日:<input type="date" v-model="userInfo.birthday"></p><p>爱好:<input type="checkbox" name="hobby" v-model="userInfo.hobby" value="c">唱歌<input type="checkbox" name="hobby" v-model="userInfo.hobby" value="t">跳舞<input type="checkbox" name="hobby" v-model="userInfo.hobby" value="r">rap<input type="checkbox" name="hobby" v-model="userInfo.hobby" value="l">打篮球</p><p>住址:<select  v-model="userInfo.address"><option value="0">--请选择--</option><option value="1">--金水区--</option><option value="2">--惠济区--</option><option value="3">--二七区--</option></select></p><p>介绍:<textarea v-model="userInfo.desc"></textarea></p><p><input type="submit" value="提交"></p></form><p v-for="(value,name) in userInfo">{{name}}:{{value}}</p></div></body><script>Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。//3.创建VUE实例var vm = new Vue({el: "#root",//指定容器名称data(){ //页面数据模板return{userInfo:{userCode:'',userName:'',userPassword:'',sex:0,birthday:'',hobby:[],address:0,desc:''}}},methods:{tijiao(){console.info(JSON.stringify(this.userInfo))}}});</script>
</html>

过滤器(filter)

对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理)

语法:

  1. 注册过滤器:Vue.filter(name,callback) new Vue{filters:{}}
  2. 使用过滤器:{{ xxx | 过滤器名}} v-bind:属性 = "xxx | 过滤器名",所以要给标签手动添加value值。

备注:v-model的三个修饰符:

  1. 过滤器也可以接收额外参数、多个过滤器也可以串联
  2. 并没有改变原本的数据, 是产生新的对应的数据
  3. 不是必须的属性,完全可以用methods和computed实现下面代码中的过滤功能
  4. 当全局过滤器和局部过滤器重名时,会采用局部过滤器。
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue初体验</title><!-- 1.引入Vue --><script src="../js/vue.js"></script>
</head>
<body><!-- 2.准备一个容器 --><div id="root"><h1>未过滤:{{name}}</h1><h1>过滤:{{name | myFilter}}</h1></div><script>Vue.filter('myFilter',function (value) {return value.slice(0,4)})//3.创建Vue实例const vm = new Vue({el:'#root',data:{name:'Hello Vue',},});</script>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/10067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web数字孪生引擎

Web数字孪生引擎是指用于在Web上创建和运行数字孪生的软件平台。它们通常提供一组API和工具&#xff0c;用于连接到实时数据源、可视化数据并创建交互式体验。Web数字孪生引擎被广泛应用于各种应用&#xff0c;例如工业物联网、智能建筑、城市管理和公共安全等。北京木奇移动技…

Unable to locate the .NET SDK

问题描述&#xff1a; vs2019 加载项目时&#xff0c;提示如下&#xff1a; Unable to locate the .NET SDK as specified by global.json, please check that the specified version is installed. 项目中没有globan找al.json 文件 先使用&#xff1a; dotnet --list-sdks 命…

玩游戏专用远程控制软件

玩游戏专用远程控制软件&#xff1a;实现远程游戏的新体验 随着网络技术的不断发展和创新&#xff0c;远程控制软件已经逐渐渗透到我们生活的方方面面&#xff0c;尤其是在游戏领域。玩游戏专用远程控制软件&#xff0c;作为这一趋势下的产物&#xff0c;为玩家提供了全新的游…

杭州打的样,适合全国推广

房地产 昨天&#xff0c;杭州和西安全面解除房地产限购。 在房价跌跌不休的今天&#xff0c;这两大城市取消限购其实并不意外。 尤其是杭州&#xff0c;土地财政依赖全国第一&#xff0c;绷不住很正常。 近十年&#xff0c;杭州依靠于亚运会、G20 和阿里巴巴&#xff0c;涨得飞…

霍金《时间简史 A Brief History of Time》书后索引(E--H)

A–D部分见&#xff1a;霍金《时间简史 A Brief History of Time》书后索引&#xff08;A–D&#xff09; 图源&#xff1a;Wikipedia INDEX E Earth: circumference, motion, shape Eclipses Eddington, Arthur Einstein, Albert: biography, see also Relativity; Special…

RabbitMQ高级(MQ的问题,消息可靠性,死信交换机,惰性队列,MQ集群)【详解】

目录 一、MQ的问题 1. 问题说明 2. 准备代码环境 1 创建project 2 创建生产者模块 3 创建消费者模块 二、消息可靠性 1. 介绍 2. 生产者确认机制 3. MQ消息持久化 4. 消费者确认机制 5. 消费者auto模式的失败重试 6. 小结 三、死信交换机和延迟消息 1. 介绍 2. …

时间序列预测模型实战案例(三)(LSTM)(Python)(深度学习)时间序列预测(包括运行代码以及代码讲解)

目录 引言 LSTM的预测效果图 LSTM机制 了解LSTM的结构 忘记门 输入门 输出门 LSTM的变体 只有忘记门的LSTM单元 独立循环(IndRNN)单元 双向RNN结构(LSTM) 运行代码 代码讲解 引言 LSTM&#xff08;Long Short-Term Memory&#xff09;是一种常用的循环神经网络&a…

Android 如何启用user版本的adb源码分析

通过adb shell中执行getprop persist.sys.usb.config&#xff0c;可以看到系统usb的相关选项&#xff0c;persist.sys.usb.config显示的就是当前系统关于usb选项的系统配置【RK3188Android4.4刚移植的例子】: 全编脚本中make命令会调用build/core/main.mk,在里面可以看到一段…

安全工程师面试题

安全工程师面试题安全工程师是一个非常重要的职位&#xff0c;他们负责保护公司的网络和系统免受黑客和恶意软件的攻击。如果你想成为一名安全工程师&#xff0c;那么你需要准备好面试。下面是一… 1安全工程师面试题 安全工程师是一个非常重要的职位&#xff0c;他们负责保护…

图解HTTP(2、简单的 HTTP 协议)

HTTP 协议用于客户端和服务器端之间的通信 请求访问文本或图像等资源的一端称为客户端&#xff0c;而提供资源响应的一端称为服务器端。 通过请求和响应的交换达成通信 请求必定由客户端发出&#xff0c;而服务器端回复响应报文 请求报文是由请求方法、请求 URI、协议版本、…

鸿蒙HarmonyOS开发:List列表组件的使用详解及案例演示(二)

文章目录 一、List组件简介1、List组件2、ListItem组件3、ListItemGroup组件 二、使用ForEach渲染列表三、设置列表分割线四、设置List排列方向五、索引值计算规则六、示例演示1、AlphabetIndexer组件2、代码3、效果 一、List组件简介 在我们常用的手机应用中&#xff0c;经常…

SinoDB数据库导入导出工具External table

External table又叫SinoDB外部表&#xff0c;外部表采用多线程机制&#xff0c;支持多线程读取、写入数据文件以及多线程数据转换、插入操作。多线程机制只需要消耗相对较少的系统资源&#xff0c;但是能提供高速数据导入、导出&#xff0c;可以应用在数据采集、表重建、数据库…

OpenGL入门第四步:摄像机视角变换与交互

OpenGL入门第一步:创建窗口、重写虚函数-CSDN博客 OpenGL入门第二步:颜色、纹理设置(解析)-CSDN博客 OpenGL入门第三步:矩阵变换、坐标系统-CSDN博客 目录 函数解析 具体代码 函数解析 相机视角变换需要与鼠标键盘进行交互,需要重写鼠标和键盘响应函数。 初始化 …

【机器学习】 人工智能和机器学习辅助决策在空战中的未来选择

&#x1f680;传送门 &#x1f680;文章引言&#x1f512;技术层面&#x1f4d5;作战结构&#x1f308;替代决策选项&#x1f3ac;选项 1&#xff1a;超级战争&#xff08;Hyperwar&#xff09;&#x1f320;选项 2&#xff1a;超越OODA&#x1f302;选项 3&#xff1a;阻止其他…

MySQL的表级锁

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;面经 ⛺️稳中求进&#xff0c;晒太阳 表级锁 介绍 对于表锁&#xff0c;分为两类&#xff1a; 表共享读锁表独占写锁 语法 1. 加锁&#xff1a;lock tables 表名... read/write 2.…

MySQL数据库的安装和部署

1.数据库的相关介绍 关系型数据库管理系统&#xff1a;&#xff08;英文简称&#xff1a;RDBMS&#xff09; 为我们提供了一种存储数据的特定格式&#xff0c;所谓的数据格式就是表&#xff0c; 在数据库中一张表就称为是一种关系. 在关系型数据库中表由两部分组成&#xf…

电信网关配置管理系统 rewrite.php 文件上传致RCE漏洞复现

0x01 产品简介 中国电信集团有限公司(英文名称“China Telecom”、简称“中国电信”)成立于2000年9月,是中国特大型国有通信企业、上海世博会全球合作伙伴。电信网关配置管理系统是一个用于管理和配置电信网络中网关设备的软件系统。它可以帮助网络管理员实现对网关设备的远…

Linux 进程信号【信号产生】

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux知识分享⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 目录 前言 信号概念 1. 生活角度的信号 2…

Java入门基础学习笔记1——初识java

1、为什么学习java&#xff1f; 几乎统治了服务端的开发&#xff1b;几乎所有的互联网企业都使用&#xff1b;100%国内大中型企业都用&#xff1b;全球100亿的设备运行java。开发岗位薪资高。 Java的流行度很高&#xff0c;商用占有率很高。 可移植性。 2、Java的背景知识 …

手机录屏怎么录?简单易懂的教程,让你轻松上手!

随着科技的不断发展&#xff0c;手机录屏已经成为人们日常生活中一个非常普遍的需求。无论是录制游戏精彩瞬间、分享App使用教程&#xff0c;还是保存线上会议、录制网课&#xff0c;手机录屏都发挥着重要作用。可是你知道手机录屏怎么录吗&#xff1f;本文将详细介绍三种手机录…