VUE常见的指令

vue的基本使用

使用vue的步骤

  • 创建vue的实例
  • 指定vue控制的区域

具体的属性意义如下图:
alt

1、打开的调试器

这里会发现,root其实是el所指定的区域,理解为root是根节点
在这里插入图片描述

2、VUE的两个特性

  1. 数据驱动试图:
  • 数据的变化会驱动视图自动更新
  • 好处:程序员只管把数据维护好,那么页面结构会被vue自动渲染出来
  1. 双向数据绑定

在网页中,from表单负责采集数据,Ajax负责提交数据

  • js数据的变化,会被自动渲染到页面上
  • 页面上表单采集的数据发生变化的时候,会被vue自动获取到,并更新到js数据中

注意:数据驱动视图和双向数据绑定的底层原理时MVVM(mode数据源,view视图,ViewModel就是vue的实例)

3、指令

指令是为vue为开发者提供的模板语法,用于辅助开发者渲染页面的基本结构

1、vue中的指令按照不同的途径分为6大类
①内容渲染指令
②属性绑定指令
③事件绑定指令
④双向绑定指令
⑤条件渲染指令
⑥列表渲染指令

3.1 内容渲染指令——用于辅助开发者渲染DOM元素的文本内容

最常用的内容渲染指令有如下3个:

  • v-text
  • {{ }}
  • v-html
3.1.1 v-text的使用方法
<!-- 把username对应的值,渲染到第一个p标签中 -->
<p v-text="username"></p>
<!-- 把gender对应的值,渲染到第二个p标签中 -->
<!-- 第二个p标签的“性别”这个文本会被gender的值覆盖掉 -->
<p v-text = "gender">性别</p>

v-text 的缺点:会覆盖元素内部原有的内容!

3.1.2 所以不想覆盖的话,我们想到了第二种方式 {{ }} 插值表达式
<!--  插值表达式{{}}  -->
  <p>姓名:{{username}}</p>
  <p>性别:{{gender}}</p>

当我们试图用{{}}和v-text来实现含有标签的内容,发现不能显示出标签效果

<p v-text="info"></p>
<p>{{info}}</p>
3.1.3 由于{{}}和v-text都不能显示html标签的内容,所以我们用v-html来表示
<p v-html="info"></p>
3.1.4 总结
  1. v-text:它的缺点是会覆盖元素内容原有的内容
  2. {{ }}插值表达式:使用较多的方法,但是他不会覆盖原有的内容
  3. v-html:由于v-text和{{}}都不能把带有标签的字符串渲染成真正的HTML内容

3.2 属性绑定指令

{{ }}只能用在内容节点上,而不能用在属性标签上,所以如果需要为元素属性动态绑定属性值,则需要用到v-bind属性绑定指令,用法如下:
vue规定可以把v-bind:简写为:

<div class="app">
<!--  vue规定可以把v-bind:简写为:-->
  <input type="text" v-bind:placeholder="tips">
  <hr>
  <img :src="photo" alt="tupian" style="width: 200px;">
</div>
<script>
  const vm = new Vue({
    el:'.app',
    data:{
      tips:'请输入用户名',
      photo:'http://static.runoob.com/images/demo/demo2.jpg'
    }
  })
</script>

补充

  • 在vue提供的模板渲染语法中,除了支持绑定简单的数据值之外,还支持JavaScript表达式的运算。比如一些加减法、三元运算、函数
    在使用v-bind属性绑定期间,如果绑定的内容需要进行动态拼接,则字符串外面应该包裹单引号,例如:<div :title:" 'box' + index ">(index是动态的)

3.3 事件绑定指令

3.3.1 定义

vue提供了v-on事件绑定指令,用来辅助程序员为DOM元素绑定事件监听,语法格式如下:

<div id="app">
  <p>count:的值是:{{count}}</p>
<!--  add是事件的函数-->
  <button v-on:click="add(3)">+1</button>
  <button v-on:click="sub">-1</button>
</div>

<!--1.导入vue的库文件,在window全局中就有了vue这个构造函数-->
<!--2.创建vue的实例对象-->
<script>
  //创建vue的实例对象
  const vm = new Vue({
    //el属性是固定的写法,表示当前vm实例要控制页面上的那个区域,接受的值是一个选择器
    el:"#app",
    //data对象就是要渲染到页面上的数据
    data:{
      count:0
    },
    //methods作用是定义事件的处理函数
    methods:{
      //也可以简写为add(){}
      add:function (n) {
        //this 完全可以替代vm,this指向的就是this
        console.log(vm === this);
        //在绑定事件参数时可以加小括号
        vm.count += n;
      },
      sub(){
        vm.count --;
      }
    }
  });
</script>
3.3.2 v-on: 指定可以简写为@
3.3.3 vue常用的一些事件指令
  1. v-on:click 或 @click
  2. v-on:input 或 @input
  3. v-on:keyup 或 @keyup
3.3.4 事件对象
1. 事件对象没有传递参数

这里注意到button v-on:click="add"的add不加(),且没有传参

<body>
<!--3.希望vue能够控制下面的这个div,帮我们在把数据填充到div内部-->
<div id="app">
  <p>count:的值是:{{count}}</p>
  <!-- 如果count是偶数,则按钮背景变成红色,否则,取消背景颜色 -->
  <button v-on:click="add">+1</button>
</div>

<!--1.导入vue的库文件,在window全局中就有了vue这个构造函数-->
<!--2.创建vue的实例对象-->
<script>
  //创建vue的实例对象
  const vm = new Vue({
    //el属性是固定的写法,表示当前vm实例要控制页面上的那个区域,接受的值是一个选择器
    el:"#app",
    //data对象就是要渲染到页面上的数据
    data:{
      count:0
    },
    //methods作用是定义事件的处理函数
    methods:{
      //也可以简写为add(){}
      add(e) {
        this.count ++;
        console.log(e);
      //判断this.count的奇偶
        if(this.count % 2 === 0){
          //偶数
          e.target.style.backgroundColor = 'red';
        }else{
          //奇数
          e.target.style.backgroundColor = '';
        }
      }
    }
  });
</script>
</body>
2. 事件对象有传递参数

这里注意到button v-on:click="add()"的add加(),并且传参,vue提供了内置变量,名字叫做$event,它就是原生DOM 的事件对象e

<body>
<!--3.希望vue能够控制下面的这个div,帮我们在把数据填充到div内部-->
<div id="app">
  <p>count:的值是:{{count}}</p>
  <!-- 如果count是偶数,则按钮背景变成红色,否则,取消背景颜色 -->
  <!-- vue提供了内置变量,名字叫做$event,它就是原生DOM 的事件对象e -->
  <button v-on:click="add(1,$event)">+1</button>
</div>

<!--1.导入vue的库文件,在window全局中就有了vue这个构造函数-->
<!--2.创建vue的实例对象-->
<script>
  //创建vue的实例对象
  const vm = new Vue({
    //el属性是固定的写法,表示当前vm实例要控制页面上的那个区域,接受的值是一个选择器
    el:"#app",
    //data对象就是要渲染到页面上的数据
    data:{
      count:0
    },
    //methods作用是定义事件的处理函数
    methods:{
      //也可以简写为add(){}
      add(n,e) {
        this.count ++;

      //判断this.count的奇偶
        if(this.count % 2 === 0){
          //偶数
          e.target.style.backgroundColor = 'red';
        }else{
          //奇数
          e.target.style.backgroundColor = '';
        }
      }
    }
  });
</script>
</body>
3.3.5 事件修饰符

在事件处理函数中调用event.preventDefault()或者event.stopPropagation()是非常常见的需求。因此vue提供了事件修饰符的概念,来辅助程序员更方便的对事件的触发进行控制。常用的5个事件修饰符如下:

  1. prevent——阻止默认行为(比如阻止a链接的跳转,阻止表单的提交等)
  2. .stop——阻止事件冒泡
  3. .capture——以捕获模式触发当前的事件处理函数
  4. .once——绑定的事件只触发1次
  5. .self——只有在event.target是当前元素自身时触发事件处理函数
<body>
<div id="app">
  <a href="http://www.baidu.com" @click.prevent="show">跳转到百度首页</a>

  <div style="height: 150px;background-color: #42b983;padding-left: 100px;line-height: 150px;" @click="divHandler">
    <button @click.stop="btnHandler">按钮</button>
  </div>

</div>
<script>
  //创建vue的实例对象
  const vm = new Vue({
    el:"#app",
    data:{
    },
    methods:{
      show(e){
        //阻止冒泡和默认的事件——js的方法:e.preventDefault()
        //vue中用@click.prevent(绑定事件同时阻止发生默认事件),这就是vue的默认修饰符.
        console.log('点击了a链接');
      },
      divHandler(e){
        console.log('divHandler');
      },
      btnHandler(e){
        console.log('btnHandler');
      },
    }
  });
</script>
</body>
3.3.6 按键修饰符

在监听键盘事件时,我们经常需要判断详细的按键。此时,可以为键盘相关的事件添加按键修饰符。

<!--只有在key是enter时调用vm.submit()-->
<input @keyup.enter = "submit">
<!--只有在key是enter时调用vm.clearInput()-->
<input @keyup.esc = "clearInput">

3.4 双向绑定指令

3.4.1 定义

vue提供了v-model双向数据绑定指令,用来辅助开发者在不操作DOM的前提下,快速获取表单的数据。

3.4.2 v-model指令
  1. input输入框
    • type=“radio”
    • type=“checkbox”
    • type=“xxxx”
  2. textarea
  3. select
  1. 只有表单元素才能使用v-model
  2. v-model是双向绑定指令,即能修改数据源(data)的数据,而v-bind是单向绑定指令,不能修改数据源的信息
<body>
<!--只有表单元素才能使用v-model-->
<div id="app">
  <p>用户名字是:{{ username}}</p>
  <input type="text" v-model="username">
  <hr>
  <input type="text" :value="username">
  <hr>
  <select v-model="city">
    <option value="">请选择指定的城市</option>
    <option value="1">北京</option>
    <option value="2">广州</option>
    <option value="3">上海</option>
  </select>
</div>

<script>
  const vm = new Vue({
    el:"#app",
    data:{
      username:'zhangsan',
      city:''
    },
  });
</script>
</body>
3.4.3 v-model的修饰符

在这里插入图片描述

  1. 关于v-model.number/trim/lazy的使用
<body>
<!--只有表单元素才能使用v-model-->
<div id="app">
  <input type="text" v-model.number="n1"> + <input type="text" v-model.number="n2"> = <span>{{ n1 + n2 }}</span>

  <hr>

  <input type="text" v-model.trim="username">
  <button @click="showName">获取用户名</button>
  
  <hr>
  <input type="text" v-model.lazy="username">
</div>
<script>
  const vm = new Vue({
    el:"#app",
    data:{
      username:'zhangsan',
      n1:1,
      n2:2,
    },
    methods:{
      showName(){
        console.log(`用户名是:"${this.username}"`)
      }
    }
  })
</script>
</body>

3.5 条件渲染指令

3.5.1 定义

条件渲染指令用来辅助开发者按需控制DOM的显示与隐藏。条件渲染指令有如下两个,分别是:

  • v-if
  • v-show
<div id="app">
	<p v-if="networkState === 200">请求成功 --- 被v-if控制</p>
	<p v-show="networkState === 200">请求成功 --- 被v-show 控制</p>
</div>

(面试题)

  • v-show适合频繁切换元素的显示状态,性能更好;而v-if则适用于:如果刚进入页面的时候,某些元素默认不需要被展示,而后期这个元素很可能也不需要被展示出来,此时v-if的性能更好。
  • v-if的原理是:每次动态创建或者移出元素,实现元素的显示和隐藏
  • v-show的原理是:动态为元素添加或者移出display:none样式,来实现元素的显示和隐藏
    在这里插入图片描述
    flag为false时,v-if就不存在了,而v-show则显示display:none
    在这里插入图片描述
3.5.2 v-if可以和v-else配合使用
	<div v-if="type === 'A'">优秀</div>
	<div v-else-if="type === 'B'">良好</div>
	<div v-else-if="type === 'C'">一般</div>
	<!--  v-else不需要判断条件,比如type === D -->
	<div v-else></div>

3.6 列表渲染指令

3.6.1 定义
  1. vue提供了v-for列表渲染指令,用来辅助开发者基于一个数组来渲染一个列表结构。v-for指令需要使用item in items形式的特殊语法,其中:

    • items是待循环的数组
    • item是被循环的每一项
  2. v-for指令还支持一个可选的第二个参数,即当前项的索引。语法格式为(item,index)in items。
    注意:v-for指令中的item项和index索引都是形参,可以根据需要进行重命名。例如(user,i)in userlist

3.6.2 强调v-for循环中key值的注意点
  1. key的注意事项
    ①key的值只能是字符串或数字类型
    ②key的值必须具有唯一性(即key的值不能重复)
    ③建议把数据项id属性的值作为key的值(因为id属性的值具有唯一性)
    ④使用index的值当作key的值没有任何意义(因为index的值不具有唯一性)
    官方建议:只要用到v-for指令,那么一定要绑定一个:key属性(即提升性能、又防止列表状态紊乱)
<body>
<div id="app">
  <table class="table table-bordered table-hover table-striped">
    <thead>
    <th>索引</th>
    <th>ID</th>
    <th>姓名</th>
    </thead>
    <tbody>
<!--    官方建议:只要用到v-for指令,那么一定要绑定一个:key属性-->
<!--而且,尽量把id作为key的值-->
<!--官方对key的值的类型,是有要求的:字符串或者数字类型-->
    <tr v-for="(item,index) in list" :key="item.id">
      <td>{{ index }}</td>
      <td>{{ item.id }}</td>
      <td>{{ item.name }}</td>
    </tr>
    </tbody>
  </table>

</div>
<script>
  //创建vue的实例对象
  const vm = new Vue({
    el:"#app",
    data:{
      list:[
        //列表数据
        {id : 1 ,name : 'zs'},
        {id : 2 ,name : 'ls'},
        {id : 3 ,name : 'ww'}
      ],
    },
  });
</script>

</body>

资料整理来自于:黑马程序员

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值