Vue学习(三)条件渲染、列表渲染

条件渲染

v-if

写法:v-if="表达式"(v-else-if="表达式"、v-else)

适用于:切换频率较低的场景。

特点:不展示的DOM元素直接被移除。

注意:v-if和v-else-if和v-else一起使用时,结构要紧挨在一起。v-if还可以和template标签一起使用,包含在template标签里面的内容会一起受到template标签的v-if的作用,且不会修改dom的结构。

v-show

写法:v-show="表达式"

适用于:切换频率较高的场景。

特点:不展示的dom未被移除,仅仅是使用样式隐藏了,设置了display属性使得其dom不展示。

条件渲染 例:

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <link rel="icon" href="favicon.ico">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vite App</title>
    <script type="text/javascript" src="../vue.js"></script>
  </head>
  <body>
    <div id="root">
      <h3 v-show="false">你好,{{name}} </h3><br/>
      <h3 v-show="1 === 2">你好,{{name}} </h3><br/>
      <h3 v-show="false">你好,{{name}} </h3><br/>
      <h3 v-if="false">你好,{{name}} </h3><br/><br/>
      <h2>当前n的值为{{n}}</h2>
      <button @click="n++">点我n加一</button>

      <div v-show="n % 3 == 0">曼波</div>
      <div v-show="n % 3 == 1">哈基米</div>
      <div v-show="n % 3 == 2">阿弥诺斯</div><hr/>

      <div v-if="n % 3 == 0">曼波</div>
      <div v-if="n % 3 == 1">哈基米</div>
      <div v-if="n % 3 == 2">阿弥诺斯</div><hr/>

      <div v-if="n % 3 === 0">曼波</div>
      <div v-else-if="n % 3 === 0">哈基米</div>
      <div v-else>阿弥诺斯</div>

      <template v-if="n % 3 == 1">
        <h2>呵呵呵</h2>
        <h2>wow</h2>
        <h2>哦耶</h2>
      </template>
    </div>
  </body>
  
  <script type="text/javascript">
    new Vue({
      el:'#root',
      data:{
        name:'李二狗',
        n:0
      }
    })
  </script>
</html>

列表渲染

列表渲染使用的语法是v-for="a in A",其中,a是迭代中的每一代的数据,A是迭代目标(可以是数组、对象,字符串也可以,但是字符串的遍历用的不多,当成一个字符数组就行)

当迭代目标是数组时

此时a代表着数组中的每一个元素,假如数组中的元素是对象,要引用其中的属性,使用{{a.属性}}即可。

除此之外,还要记得标明元素的唯一性标识,使用:key="a.属性(唯一性标识)"

a还可以写作(a,index),即v-for="(a,index) in A",此时第一个参数a代表着数组中的每一个元素,第二个参数index代表着数组中元素的下标。所以如果数组中的元素不是对象或者没有唯一性标识,可以使用index作为唯一性标识。

html 复制代码
  	  <ul>
        <li v-for="person in persons" :key="person.id">
          姓名:{{person.name}}  年龄:{{person.age}}
        </li>
      </ul>

如此页面上就会遍历展示persons中的每个person的相关信息

还可以写作v-for="a in 数字",意思是遍历几次,a in 5就是遍历五次。用的比较少。

当迭代目标是对象时

此时的a应该写作(value,key),唯一性标识写key即可,此时的key就是属性名,value就是属性值

html 复制代码
      <ul>
        <li v-for="(value,key) in cars" :key="key">
          {{key}}是{{value}}
        </li>
      </ul>

案例:

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <link rel="icon" href="favicon.ico">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vite App</title>
    <script type="text/javascript" src="../vue.js"></script>
  </head>
  <body>
    <div id="root">
      <h3>你好,{{name}} </h3><br/>
      <!-- 遍历数组 -->
      <ul>
        <li v-for="person in persons" :key="person.id">
          姓名:{{person.name}}  年龄:{{person.age}}
        </li>
      </ul>
      <hr/>
      <!-- index是元素在数组中的索引 -->
      <ul>
        <li v-for="(person,index) in persons" :key="person.id">
          姓名:{{person.name}}  --年龄:{{person.age}} --index: {{index}}
        </li>
      </ul>
      <!-- 对象 -->
      <ul>
        <li v-for="(value,key) in cars" :key="key">
          {{key}}是{{value}}
        </li>
      </ul>
    </div>
  </body>
  
  <script type="text/javascript">
    new Vue({
      el:'#root',
      data:{
        name:'李二狗',
        persons:[
          {id:'001',name:'张三',age:18},
          {id:'002',name:'李四',age:19},
          {id:'003',name:'王五',age:20}
        ],
        cars:{
          name:'比亚迪',
          price:20000,
          color:'black'
        }
      }
    })
  </script>
</html>

key的作用:key是虚拟DOM对象的标识,当状态中的数据发生变化时,vue会根据新的数据生产新的虚拟DOM,随后vue会将新的虚拟DOM和旧的虚拟DOM进行比较,当key相同以及其中内容相同时才会直接使用之前的虚拟DOM。如此才不会出现错误的DOM更新。并且使用key时,能在插入数据时,不会出现多条数据的虚拟DOM更新,效率更高。

列表过滤

监视属性实现

没有新的知识点,直接见案例

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <link rel="icon" href="favicon.ico">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vite App</title>
    <script type="text/javascript" src="../vue.js"></script>
  </head>
  <body>
    <div id="root">
      <input type="text" placeholder="请输入名字" v-model="keyWords">
      <ul>
        <li v-for="person in Fpersons" :key="person.id">
          --姓名:{{person.name}} --年龄:{{person.age}} --性别:{{person.gender}}
        </li>
      </ul>
      <hr/>
    </div>
  </body>
  
  <script type="text/javascript">
    new Vue({
      el:'#root',
      data:{
        name:'李二狗',
        keyWords:'',
        persons:[
          {id:'001',name:'亚托克斯',age:18,gender:'男'},
          {id:'002',name:'维鲁斯',age:19,gender:'男'},
          {id:'003',name:'希维尔',age:20,gender:'女'},
          {id:'004',name:'伊泽瑞尔',age:21,gender:'男'}
        ],
        Fpersons:[]
      },
      watch:{
        keyWords:{
          immediate:true,
          handler(newValue){
            this.Fpersons=this.persons.filter((p)=>{
              return p.name.indexOf(newValue) !== -1
            })
          }
        }
      }
    })
  </script>
</html>

计算属性实现

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <link rel="icon" href="favicon.ico">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vite App</title>
    <script type="text/javascript" src="../vue.js"></script>
  </head>
  <body>
    <div id="root">
      <input type="text" placeholder="请输入名字" v-model="keyWords">
      <ul>
        <li v-for="person in Fpersons" :key="person.id">
          --姓名:{{person.name}} --年龄:{{person.age}} --性别:{{person.gender}}
        </li>
      </ul>
      <hr/>
    </div>
  </body>
  
  <script type="text/javascript">
    new Vue({
      el:'#root',
      data:{
        name:'李二狗',
        keyWords:'',
        persons:[
          {id:'001',name:'亚托克斯',age:18,gender:'男'},
          {id:'002',name:'维鲁斯',age:19,gender:'男'},
          {id:'003',name:'希维尔',age:20,gender:'女'},
          {id:'004',name:'伊泽瑞尔',age:21,gender:'男'}
        ]
      },
      computed:{
        Fpersons(){
          return this.persons.filter((p)=>{
              return p.name.indexOf(this.keyWords) !== -1
            })
        }
      }
    })
  </script>
</html>

可以看出,此时计算属性实现更为方便

列表排序

在计算属性的逻辑中加上排序的逻辑即可

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <link rel="icon" href="favicon.ico">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vite App</title>
    <script type="text/javascript" src="../vue.js"></script>
  </head>
  <body>
    <div id="root">
      <input type="text" placeholder="请输入名字" v-model="keyWords">
      <ul>
        <li v-for="person in Fpersons" :key="person.id">
          --姓名:{{person.name}} --年龄:{{person.age}} --性别:{{person.gender}}
        </li>
      </ul>
      <button @click="order = 0">原顺序</button>
      <button @click="order = 1">降序</button>
      <button @click="order = 2">升序</button>
      <hr/>
    </div>
  </body>
  
  <script type="text/javascript">
    new Vue({
      el:'#root',
      data:{
        name:'李二狗',
        keyWords:'',
        order:0, //排序方式,0原顺序,1降序,2升序
        persons:[
          {id:'001',name:'亚托克斯',age:18,gender:'男'},
          {id:'002',name:'维鲁斯',age:17,gender:'男'},
          {id:'003',name:'希维尔',age:22,gender:'女'},
          {id:'004',name:'伊泽瑞尔',age:21,gender:'男'}
        ]
      },
      computed:{
        Fpersons(){
          const arr = this.persons.filter((p)=>{
            return p.name.indexOf(this.keyWords) !== -1
          })
          //判断是否需要排序
          if(this.order != 0){
            arr.sort((p1,p2)=>{
              if(this.order == 1){
                return p2.age - p1.age
              }else if(this.order == 2){
                return p1.age - p2.age
              }
            })
          }
          return arr
        }
      }
    })
  </script>
</html>
相关推荐
景天科技苑2 分钟前
【vue3+vite】新一代vue脚手架工具vite,助力前端开发更快捷更高效
前端·javascript·vue.js·vite·vue项目·脚手架工具
VertexGeek11 分钟前
Rust学习(八):异常处理和宏编程:
学习·算法·rust
小行星12513 分钟前
前端预览pdf文件流
前端·javascript·vue.js
join815 分钟前
解决vue-pdf的签章不显示问题
javascript·vue.js·pdf
小行星12520 分钟前
前端把dom页面转为pdf文件下载和弹窗预览
前端·javascript·vue.js·pdf
Lysun00130 分钟前
[less] Operation on an invalid type
前端·vue·less·sass·scss
J总裁的小芒果1 小时前
Vue3 el-table 默认选中 传入的数组
前端·javascript·elementui·typescript
二进制_博客1 小时前
Flink学习连载文章4-flink中的各种转换操作
大数据·学习·flink
Lei_zhen961 小时前
记录一次electron-builder报错ENOENT: no such file or directory, rename xxxx的问题
前端·javascript·electron
咖喱鱼蛋1 小时前
Electron一些概念理解
前端·javascript·electron