目录
v-model.lazy:在change时触发而非inupt时(失去焦点或enter键的时候才会绑定数据)
v-model.number:输入字符串转为有效的数字(有效:能转数字就转,不能转就不转)
v-model.trim:去掉字符串首尾空格
- <body>
- <!-- HTML结构 -->
- <div id="app">
- <input type="text" placeholder="请输入姓名" v-model.lazy="name"><br>
- <p>您的姓名是{{name}}</p>
- <hr>
- <input type="text" placeholder="请输入年龄" v-model.number="age"><br>
- <p>您的年龄是:{{age}}</p>
- <hr>
- <input type="text" placeholder="请输入分数" v-model.trim="grade">
- <p>您的分数是:{{grade}}</p>
- <hr>
- </div>
- <script>
- /* 创建vue实例 */
- let app = new Vue({
- //el:挂载点
- el: '#app',
- //data: 要渲染的数据
- data: {
- name: '',
- age: "",
- grade: '',
-
- }
- })
- </script>
- </body>
1.默认情况下, v-model指令绑定的是表单元素的value值 (复选框checkbox除外)
2.如果遇到复选框checkbox
非数组 : 一般用于单个复选框,此时绑定的是checked属性 布尔类型
数组 : 一般用于多个复选框,此时绑定的是value属性
- <body>
-
- <!-- HTML结构 -->
- <div id="app">
- <h2>姓名</h2>
- <input type="text" v-model.lazy="name">
- <h2>性别</h2>
- <!-- 单选框 radio 加上name给同样属性值,实现单选效果 -->
- <!--v-model获取得到是value值,所以要给input[radio]增加value属性 -->
- <input type="radio" value="男" name="sex" v-model="gender">男
- <input type="radio" value="女" name="sex" v-model="gender">女
- <h2>爱好</h2>
- <!--v-model获取得到是value值,所以要给input[checkbox]增加value属性 -->
- <input type="checkbox" value="学习" v-model="hobby">学习
- <input type="checkbox" value="上课" v-model="hobby">上课
- <input type="checkbox" value="敲代码" v-model="hobby">敲代码
- <input type="checkbox" value="打游戏" v-model="hobby">打游戏
- <h2>学科</h2>
- <select name="" id="" value="学科" v-model="subject">
- <option value="">请选择学科</option>
- <option value="1">前端</option>
- <option value="2">java</option>
- <option value="3">测试</option>
- </select>
- <h2>自我介绍</h2>
- <textarea rows="10" v-model.lazy.trim="info"></textarea>
- {{name}}
- <br>
- {{gender}}
- <br>
- {{hobby}}
- <br>
- {{subject}}
- <br>
- {{info}}
- <br>
- </div>
- <script>
- /* 创建vue实例 */
- let app = new Vue({
- //el:挂载点
- el: '#app',
- //data: 要渲染的数据
- data: {
- name: '',
- gender: '男',
- hobby: ['学习'],
- subject: '1',
- info: '',
- }
- })
- </script>
- </body>
(1)作用: 根据条件渲染数据
(2)语法:
单分支: v-if="条件语句"
双分支: v-else
多分支: v-else-if="条件语句"
(3)注意点
v-else与v-else-if的前面 必须要有 v-if 或者 v-else-if
- <body>
-
- <!-- HTML结构 -->
- <div id="app">
-
- <input type="text" placeholder="请输入考试分数" v-model.number="score">
- <h2>你的考试分数为:{{score}}</h2>
- <hr>
- <h3 v-if="score>=90">爸爸给你买法拉利</h3>
- <h3 v-else-if="score>=80">爸爸给你买保时捷</h3>
- <h3 v-else-if="score>=60">爸爸给你买奥迪</h3>
- <h3 v-else>不及格</h3>
- </div>
- <script>
- /* 创建vue实例 */
- let app = new Vue({
- //el:挂载点
- el: '#app',
- //data: 要渲染的数据
- data: {
- score: ''
- }
- })
- </script>
- </body>
(1)作用: 设置元素的display属性值
(2)语法: v-show="属性值"
属性值为true: 元素的display:block
属性值为false: 元素的display:none
- <body>
- <!-- HTML结构 -->
- <div id="app">
- <p v-if="age>30">我是v-if渲染出来的</p>
- <p v-if="flag">我是v-if渲染出来的</p>
- <p v-show="age>30">我是v-show渲染出来的</p>
- <p v-show="flag">我是v-show渲染出来的</p>
- </div>
- <script>
- /* 创建vue实例 */
- let app = new Vue({
- //el:挂载点
- el: '#app',
- //data: 要渲染的数据
- data: {
- age: '40',
- flag: true
- }
- })
- </script>
- </body>
v-show与v-if区别
🏆 v-if: 元素的新增与移除 适用于不需要频繁切换
**v-if有更好的初始渲染性能,因为当条件为false的时候v-if不会渲染,只有当条件为true才会渲染.
🏆v-show: css样式display显示与隐藏。 只是修改元素的display属性值 用于频繁切换的盒子显示隐藏
**v-show有更好的切换性能。因为v-show无条件渲染的,本质只是修改元素的css样式。
1.原理不同:v-if本质是元素新增与移除,v-show本质是修改元素的display属性
2.场景不同:v-if用于不需要频繁切换的元素,v-show用于需要频繁切换的元素
3.性能不同:v-if初始渲染性能高,切换性能低。v-show初始渲染性能低,切换性能高
vue中key值作用
* (1)让vue准确的识别DOM元素 (类似于给元素添加一个身份证)
* (2)让vue强制更新DOM
应用场景:
💎 使用v-if 切换元素
*(1)v-if:两个盒子里面的DoM结构相同的时候,使用vue值让vue准确的识别渲染元素
💎 使用v-for 渲染列表
* 什么时候用key值 :所有的v-for推荐全部加上key值
了解虚拟DOM:
(1)真实DOM:存储几百个属性
(2)虚拟DOM:只存储元素核心的十几个属性
*虚拟DOM本质是一个js对象,与真实DOM最大的区别是虚拟DOM只存储少部分核心属性,从而提高渲染效率
(3)虚拟DOM如何工作的:
a.把页面元素转换为虚拟DOM(VNode)
b.当vue数据变化的时候,使用diff算法对比新旧vnode
c.只更新变化的部分
- <body>
- <!-- HTML结构 -->
- <div id="app">
- <button v-text="type" @click="flag=!flag , type=flag? '手机号注册':'邮箱注册'"></button>
- <div v-if="flag" nmb="phone">
- 手机号:<input type="text" placeholder="请输入手机号">
- <br>
- 验证码:<input type="text" placeholder="请输入验证码">
- </div>
- <div v-else>
- 邮箱:<input type="text" placeholder="请输入邮箱">
- <br>
- 密码:<input type="text" placeholder="请输入邮箱密码">
- </div>
- </div>
- <script>
-
- /* 创建vue实例 */
- var app = new Vue({
- //el:挂载点
- el: '#app',
- //data: 要渲染的数据
- data: {
- flag: true,
- type: "手机号注册"
- }
- ,
-
- })
- </script>
- </body>
v-for指令使用key值几种情况
1.没有key值: 就地更新
2.key值为下标 : 就地更新 (与不设置key值没有区别)
🏆3.key值为id (唯一字符串): 复用相同的key, 更新不同的key
* 同级父元素中,子元素的key值必须是唯一的,否则vue会报错。(类似于相同作用于变量名不能重复)
总结: v-for指令的key值优先使用唯一字符串(性能最高), 实在没有就用下标index
- <body>
- <!-- HTML结构 -->
- <div id="app">
- <ul>
- <li v-for="(item,index) in list " :key="item.id">
- <span>姓名:{{item.name}}
- </span>
- <span>年龄:{{item.age}}</span>
- </li>
- </ul>
-
- </div>
-
- <script>
- /* 创建vue实例 */
- var app = new Vue({
- //el:挂载点
- el: '#app',
- //data: 要渲染的数据
- data: {
- list: [
- { id: '21378', name: '张三', age: 20 },
- { id: '12456', name: '李四', age: 22 },
- { id: '39862', name: '王五', age: 30 },
- ]
- }
- })
- </script>
- </body>
v-for更新检测
1.数组的方法分为两种
第一种: 会改变原数组的元素值, 例如 reverse()、pop()、push()、sort()等
* 这种情况 v-for也会更新
第二种:不会改变原数组的元素值. 例如 slice() 、 filter() 、 concat()等
* 这种情况 v-for不会更新
slice() 方法返回一个新的数组对象,这一对象是一个由 begin 和 end 决定的原数组的浅拷贝(包括 begin,不包括end)。原始数组不会被改变。
2.总结 : 如果v-for没有更新. 可以覆盖整个数组, 或 使用 vue.$set() 强制更新
- <body>
-
- <!-- HTML结构 -->
- <div id="app">
- <ul>
- <li v-for="(item,index) in list" ::key="index">
- {{item}}
- </li>
- </ul>
- <button @click="revBtn">数组翻转</button>
- <button @click="sliceBtn">截取前2个</button>
- <button @click="updateBtn">更新第一个元素值</button>
- </div>
- <script>
- /* 创建vue实例 */
- var app = new Vue({
- //el:挂载点
- el: '#app',
- //data: 要渲染的数据
- data: {
- list: [
- 10, 20, 30, 40, 50
- ]
- },
- //methods:事件处理函数
- methods: {
- // 翻转 reverse () :v-for会更新
- revBtn() {
- this.list.reverse()
- },
- // 截取前俩个 slice():v-for不会更新
- sliceBtn() {
- this.list = this.list.slice(0, 2)//把返回的数组赋给新的数组
- },
- //3.替换元素值,不会造成v-for更新
-
- updateBtn() {
- // this.$set(更新的数组,下标,更新后的值) 强制更新
- this.$set(this.list, 0, '饿了')
- },
-
- }
- })
- </script>
- </body>
🏆(1)计算属性作用:解决模板语法代码冗余问题
*场景:数据需要通过计算才能得到
🏆(2)计算属性语法
computed: {
计算属性名(){
return 计算属性值
}
}
🏆(3)注意点
a.计算属性要写在vue实例computed中
b.计算属性函数一定要有返回值
🏆(4)计算属性缓存机制
a.当第一次使用计算属性的时候,vue会调用一次函数。然后把函数名和返回值平铺到vue属性中。
b.之后使用计算属性,vue不会调用这个函数,而是从缓存中直接读取。
c.只有当计算属性内部的数据发生变化的时候,才会重新执行一次这个函数,然后又放入缓存
- <body>
-
- <div id="app">
- <p>{{msg}}p>
-
-
- <p>{{reversemsg}} p>
-
-
- <p> {{reversemsg}} p>
- div>
- <script>
- /* 创建vue实例 */
- let app = new Vue({
- //el:挂载点
- el: '#app',
- //data: 要渲染的数据
- data: {
- msg: '我爱敲代码',
- },
- //计算属性
- computed: {
- reversemsg() {
- console.log("我被调用了");
- // 返回翻转字符串 字符串split方法和数组的reverse和join方法组合使用
- return this.msg.split("").reverse().join("")
- }
- }
- })
- script>
- body>
1. 默认情况下,计算属性只有get方法。没有set,只能获取,不能修改。否则程序会报错
2. 如果希望计算属性可以修改,则可以实现set方法
computed: {
“计算属性名”: {
// 取值
get() {
},
// 设值
set(val) {}
}
- <body>
- <!-- HTML结构 -->
- <div id="app">
- 全名:<input type="text" placeholder="请输入你的全名" v-model.lazy="fullName">
- <br>
- 姓氏:<input type="text" placeholder="请输入你的姓氏" v-model.lazy="firstname">
- <br>
- 名字:<input type="text" placeholder="请输入你的名字" v-model.lazy="lastname">
- </div>
- <script>
- /* 创建vue实例 */
- var app = new Vue({
- //el:挂载点
- el: '#app',
- //data: 要渲染的数据
- data: {
- firstname: '',
- lastname: '',
- },
- //计算属性
- computed: {
- fullName: {
- // 取值
- get() {
- return `${this.firstname}${this.lastname}`
- },
- // 设值
- set(val) {
- console.log(val)
- this.firstname = val[0] || ""
- // substring() 方法返回一个字符串在开始索引到结束索引之间的一个子集,或从开始索引直到字符串的末尾的一个子集。
- this.lastname = val.substring(1)
- // this.lastname = val.split('').slice(1).join('')
- // this.lastname = val.replace(val[0], '')
-
- }
- }
- }
- })
- </script>
- </body>
需求:
1.单选框全选后,全选框自动勾选
2.全选框勾选后单选框自动勾选
全选框的实现
💎计算属性的get把单选框的状态通过every方法 传给全选框
💎全选框的状态通过计算属性的set更改单选框的状态
- computed: {
- isAll: {
- set(val) {//全选框的checked值
- this.list.forEach(item => item.select = val)
- },
- get() {
- // arr.some:判断是否'有元素'满足条件(逻辑或,一真则真,全假为假)
- // arr.every:判断是否'所有元素'满足条件(逻辑与,一假则假,全真为真)
-
- // 如果所有都被选中,则isAll为true
- return this.list.every(item => item.select)
- }
- }
- <body>
-
- <!-- HTML结构 -->
- <div id="app">
- 全选<input type="checkbox" v-model="isAll">
- <ul>
- <li v-for="item in list" :key="index">
- <input type="checkbox" v-model="item.select"> <label for="">{{item.name}}</label>
- </li>
- </ul>
- </div>
- <script>
- /* 创建vue实例 */
- var app = new Vue({
- //el:挂载点
- el: '#app',
- //data: 要渲染的数据
- data: {
- list: [
- { name: '前端', select: false },
- { name: 'UI', select: false },
- { name: 'Java', select: false },
- { name: 'php', select: false },
- { name: 'python', select: false },
- { name: 'c', select: false },
- { name: '测试', select: false },
- { name: '产品', select: false },
- ]
- },
- //计算属性
- computed: {
- isAll: {
- set(val) {//全选框的checked值
- this.list.forEach(item => item.select = val)
- },
- get() {
- // arr.some:判断是否'有元素'满足条件(逻辑或,一真则真,全假为假)
- // arr.every:判断是否'所有元素'满足条件(逻辑与,一假则假,全真为真)
-
- // 如果所有都被选中,则isAll为true
- return this.list.every(item => item.select)
- }
- }
-
- }
- })
- </script>
- </body>
1.侦听器作用 : 监听某一个数据变化
2.侦听器语法 : 在vue实例的watch对象中
watch:{
'data属性名'(newVal,oldVal){
}
}
- <body>
-
- <!-- HTML结构 -->
- <div id="app">
- 用户名: <input type="text" placeholder="请输入用户名" v-model.lazy="name"><span>{{info}}</span>
- <br>
- 密码: <input type="text" placeholder="请输入密码" v-model="psw">
- </div>
-
- <script>
- /* 创建vue实例 */
- let app = new Vue({
- //el:挂载点
- el: '#app',
- //data: 要渲染的数据
- data: {
- name: '',
- psw: '',
- info: "",
- },
- //侦听器
- watch: {
- name(newval, oldVal) {
- console.log(newval, oldVal);
- this.info = "验证中...."
- // 模拟网络请求
- setTimeout(() => {
- this.info = "该用户已被注册"
-
- }, 700)
- }
- }
- })
-
-
- </script>
- </body>
1.深度侦听作用 : 侦听引用类型内部数据变化
2.语法:
watch: {
"要侦听的属性名": {
deep: true, // 深度侦听复杂类型内变化
handler (newVal, oldVal) {}
}
}
- <body>
-
- <!-- HTML结构 -->
- <div id="app">
- 用户名: <input type="text" placeholder="请输入用户名" v-model.lazy="user.name"><span>{{info}}</span>
- <br>
- 密码: <input type="text" placeholder="请输入密码" v-model="user.psd">
- </div>
-
- <script>
- /* 创建vue实例 */
- let app = new Vue({
- //el:挂载点
- el: '#app',
- //data: 要渲染的数据
- data: {
- user: {
- name: '',
- psd: '',
- }
- ,
- info: ''
- },
- //侦听器
- watch: {
- // 包在要监听的数据里
- user: {
- deep: true,//深度监听变化
- handler(newVal, oldVal) {
- console.log(newVal, oldVal);
- this.info = "验证中...."
- setTimeout(() => {
- this.info = "登录失败"
-
- }, 700)
- }
- }
-
- }
- })
-
-
- </script>
- </body>
(1)作用不同:计算属性解决模板渲染冗余问题,侦听器侦听某一个数据变化
(2).语法不同
1)计算属性有返回值,侦听器没有返回值
2)计算属性可以新增属性,而侦听器只能侦听data中的属性
🏆(3)****缓存机制不同:计算属性有缓存,侦听器没有缓存
🏆(4)****代码不同:计算属性不支持异步操作,侦听器支持
(5) 监听数量不同:计算属性可以监听多个数据变化,侦听器只能监听一个数据变化
(6)初始执行时机不同:
- 计算属性在页面一加载的时候就会执行一次
- 侦听器只有在数据第一次发生变化的时候才会执行
1.导入js
<script src="./moment.js"></script>
2.基本使用
- // (1)基本使用
- let date1 = moment().format('YYYY-MM-DD')
3.在moment中传入时间
- // (2)在monent中传入时间
- let date2 = moment(new Date('2011-2-3')).format('YYYY年MM月DD日--HH时mm分ss秒')
- console.log(date2);