目录
在应用界面,某个元素的样式是变化的,class/style绑定就是专门用来实现动态样式效果的技术
:class='xxx'
- 表达式是字符串:'classA'
- 表达式是对象:{classA:isA,classB:isB}
- 表达式时数组:['classA','classB']
:style="{fontSize: xxx}"
- 其中xxx是动态值
:style=“[a,b]
条件渲染指令:v-if与v-else、v-show
写法
- v-if=“表达式”
- v-else-if=“表达式”
- v-else=“表达式”
使用于切换频率比较低的场景
特点:
不展示的DOM元素直接被移除注意:
- v-if可以和:v-else-if、v-else一起使用,但要求结构不能被打断
- v-if与template配合使用可以不破坏布局
使用v-if做条件渲染
-
- <h2 v-if="false">欢迎来到{{name}}h2>
- <h2 v-if="1 === 1">欢迎来到{{name}}h2>
v-else和v-else-if
要求结构不能被打断
- if="n === 1">Angular
- <div v-else-if="n === 2">Reactdiv>
- <div v-else-if="n === 3">Vuediv>
- <div v-else>哈哈div>
v-if与template的配合使用
-
- <template v-if="n === 1">
- <h2>你好h2>
- <h2>尚硅谷h2>
- <h2>北京h2>
- template>
写法:
v-show=“表达式”适用于切换频率较高的场景
特点:
不展示的Dom元素未被移除,仅仅是使用样式隐藏掉
-
- <h2 v-show="false">欢迎来到{{name}}h2>
- <h2 v-show="1 === 1">欢迎来到{{name}}h2>
v-for指令
用于展示列表数据
语法:v-for=“(item,index) in xxx” :key=“yyy”
可遍历:数组。对象、字符串(用的很少)、指定次数(用的很少)
-
- <div id="root">
-
- <h1>姓名列表(数组)h1>
- <ul>
- <li v-for="(p,k) in persons" :key="k">
- {{p.name}}-{{p.age}}
- li>
- ul>
-
- <h1>汽车列表(对象)h1>
- <ul>
- <li v-for="(p,k) in cars" :key="k">
- {{p}}-{{k}}
- li>
- ul>
-
- <h1>字符串列表h1>
- <ul>
- <li v-for="(p,k) in str" :key="k">
- {{p}}-{{k}}
- li>
- ul>
-
- <h1>遍历次数h1>
- <ul>
- <li v-for="(p,k) in 6" :key="k">
- {{p}}-{{k}}
- li>
- ul>
- div>
-
-
-
-
- Vue.config.productionTip = false;
- new Vue({
- el: '#root',
- data: {
- persons: [
- { id: '001', name: '张三', age: 18 },
- { id: '002', name: '李四', age: 19 },
- { id: '003', name: '王五', age: 20 }
- ],
- cars: {
- name: '奥迪A8',
- price: '70万',
- color: '粉色'
- },
- str: 'nihao'
- }
- })
-
1. 虚拟DOM中key的作用:
key是虚拟DOM对象的标识,当数据发生变化时,Vue会根据【新数据】生成【新的虚 拟DOM】,随后Vue进行【新虚拟DOM】与【旧虚拟DOM】的差异比较
2.对比规则:
(1).旧虚拟DOM中找到了与新虚拟DOM相同的key:
①.若虚拟DOM中内容没变, 直接使用之前的真实DOM!
②.若虚拟DOM中内容变了, 则生成新的真实DOM,随后替换掉页面中之前的真实 DOM。
(2).旧虚拟DOM中未找到与新虚拟DOM相同的key
创建新的真实DOM,随后渲染到到页面。
3. 用index作为key可能会引发的问题:
1. 若对数据进行:逆序添加、逆序删除等破坏顺序操作:
会产生没有必要的真实DOM更新 ==> 界面效果没问题, 但效率低。
2. 如果结构中还包含输入类的DOM:
会产生错误DOM更新 ==> 界面有问题。
4. 开发中如何选择key?:
1.最好使用每条数据的唯一标识作为key, 比如id、手机号、身份证号、学号等唯一值。
2.如果不存在对数据的逆序添加、逆序删除等破坏顺序操作,仅用于渲染列表用于展示,
使用index作为key是没有问题的。
若:则 v-model收集的是value值,用户输入的就是value值
若: 则v-model收集的是value值,且要给标签配置value值
若:
1. 没有配置input的value属性,那么收集的就是checked(布尔值)
2. 配置input的value属性:
1. v-model的初始值是非数组,那么收集的就是checked(布尔值)
2. v-model的初始值是数组,那么收集的就是value组成的数组
注意:
v-model的三个修饰符:lazy: 失去焦点在收集数据
number: 输入字符串转为有效的数字
trim: 输入首位空格过滤,中间不过滤
1. 若:则 v-model收集的是value值,用户输入的就是value值
2. 若: 则v-model收集的是value值,且要给标签配置value值
3. 若:
1. 没有配置input的value属性,那么收集的就是checked(布尔值)
2. 配置input的value属性:
1. v-model的初始值是非数组,那么收集的就是checked(布尔值)
2. v-model的初始值是数组,那么收集的就是value组成的数组
- html>
- <html lang="en">
-
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Documenttitle>
- <script src="js/vue.js">script>
- head>
-
- <body>
- <div id="root">
- <form @submit.prevent="submit">
- 账号:<input type="text" v-model="accont"> <br><br>
- 密码:<input type="password" v-model="password"><br><br>
- 性别:
- 男 <input type="radio" v-model="sex" value="male">
- 女<input type="radio" v-model="sex" value="famale"> <br><br>
- 爱好:学习<input type="checkbox" v-model="hobby" value="study">
- 打游戏<input type="checkbox" v-model="hobby" value="game">
- 吃饭<input type="checkbox" v-model="hobby" value="eat"><br><br>
- 所属校区
- <select v-model="address">
- <option value="">请选择校区option>
- <option value="beijing">北京option>
- <option value="shanghai">上海option>
- <option value="shenzhen">深圳option>
- select><br><br>
- 其他信息:<textarea v-model="anther">textarea><br><br>
- <button>提交button>
- form>
- div>
-
- <script>
- Vue.config.productionTip = false;
- new Vue({
- el: '#root',
- data: {
- accont: '',
- password: '',
- sex: '',
- hobby: [],
- address: '',
- anther: ''
- },
- methods: {
- submit() {
- alert("1");
- }
- },
- })
- script>
- body>
-
- html>
定义
对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理)
语法:
1. 注册过滤器:
Vue.filter(name,callback) 或 new Vue{filters:{}}
2. 使用过滤器:
{{xxx | 过滤器名}} 或 v-bind:属性 = “xxx | 过滤器名”
备注:
1. 过滤器也可以接受额外的参数,多个过滤器也可以串联
2. 并没有改变原来的数据,是产生新的对应的数据
- html>
- <html lang="en">
-
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Documenttitle>
- <script src="js/vue.js">script>
- <script src="js/dayjs.min.js">script>
- head>
-
- <body>
- <div id="root">
- <h1>当前时间h1>
-
- <h3>{{fmTime}}h3>
-
- <h3>{{formatTime()}}h3>
-
- <h3>{{time | timeFormat }}h3>
-
- <h3>{{time | timeFormat | mySlice}}h3>
- div>
- <script>
- Vue.config.productionTip = false;
- // 过滤器全局使用方法
- Vue.filter('mySlice', function (val) {
- return val.slice(0, 4);
- })
- new Vue({
- el: '#root',
- data: {
- time: 1660641877002 //获取的时间戳
- },
- computed: {
- fmTime() {
- return dayjs(this.time).format('YYYY-MM-DD HH:mm:ss')
- }
- },
- methods: {
- formatTime() {
- return dayjs().format('YYYY-MM-DD HH:mm:ss')
- }
- },
- //局部过滤器
- filters: {
- timeFormat(val) {
- return dayjs(val).format('YYYY年MM月DD日 HH:mm:ss')
- },
- // mySlice(val) {
- // return val.slice(0, 4);
- // }
- }
- })
- script>
- body>
-
- html>