全栈工程师开发实战之从入门到技术实战之02--vue指令

Posted teayear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全栈工程师开发实战之从入门到技术实战之02--vue指令相关的知识,希望对你有一定的参考价值。

第二章:vue指令和事件处理

回顾:

vue:

​ vue ?

​ 发展历史,产生背景

​ 优势:

​ 核心:数据决定视图,双向数据绑定

​ MVC:

​ 三层架构:

​ MVVM: Model View ViewModel vue的实例对象

本章目标

  • 了解什么是 Vue.js 指令
  • 理解 Vue.js 指令的用途
  • 掌握 Vue.js 指令的书写规范
  • 能够使用 Vue.js 指令完成部分页面交互效果

一、vue指令

1.1 相关插件安装

高亮代码括号的插件

vue的代码提示插件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6kqd13Tt-1654938578648)(assets/image-20220202161926801.png)]

标签重命名插件

1.2 什么是 Vue指令

指令 (Directives) 是带有 v- 前缀的特殊 attribute。指令 attribute 的值预期是单个 JavaScript 表达式。指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM。解析模板/标签(标签属性,标签体内容,绑定事件等)
例如:

//点击toggle按钮,会显示红色方块,再次点击,红色方块消失,这里就是通过控制属性的真假,通过指令作用到红色方块上来控制方块的显示隐藏
<button v-on:click="isaaa = !isaaa">toggle</button>
<div class="block" v-show="isaaa"></div>

1.3 Vue.js 指令的书写规范

//书写位置:任意 html 元素的开始标签内
<p v-if="seen">现在你看到我了</p>

//注意:一个开始标签内可写入多个指令,多个指令间使用空格分隔
<a href="javascript:;" :class="active:timeflag" @click="queryAll('time')">全部</a>

1.4 常用指令

  • v-text

    语法格式:v-text='表达式'

    作用相当于之前学习的DOM操作中的innerText属性,会直接覆盖元素中原本的文本内容,实际开发中使用不多

    <p v-text="name+'法撒旦'"></p>
    <script>
    let app = new Vue(
    			el:'p',
    			data:
    				stat:true,
    				name:'张三'
    			
    		)
    </script>
    
  • v-html

    语法格式:v-html='表达式'

    作用相当于DOM操作中的innerHTML属性,可以识别字符串中的标签。

<p v-html="msg"></p>
<script>
let app = new Vue(
			el:'p',
			data:
				msg:'<h1>你好哈哈哈</h1>'
			
		)
</script>
  • **v-if v-else-if v-else **

    作用等同于js代码中的 if else if elseif else 帮助我们按照需求去控制DOM元素的显示与隐藏。

    语法格式:v-if='表达式' v-else-if='表达式' v-else='表达式'

    注意: v-if 和后续的v-else-if v-else都要连续使用,如果中间有间隔,效果是可以正常显示的,但是,控制台会报错。这个特性针对操作同级元素的时候来说。

    <body>
        <div id="max">
            <ul v-if='num>10'>
                <li>你好哈哈1</li>
                <li>你好哈哈2</li>
                <li>你好哈哈3</li>
            </ul>
            <ul v-else="num>5">
                <li>你好嘿嘿1</li>
                <li>你好嘿嘿2</li>
                <li>你好嘿嘿3</li>
            </ul>
        </div>
    </body>
    <script>
        let app = new Vue(
            el: '#max',
            data: 
                num: 9
            
        )
    </script>
    
  • v-show

    控制元素是否显示,作用等同于css样式的display:none 或非none

    语法格式: v-show='true/false'; true为显示,false为不显示

    <div id="max">
    			<p v-show='stat'>你好哈哈哈</p>
    			<button v-on:click='tiggleShow()'>点我</button>
    		</div>
    <script type="text/javascript">
    		let app = new Vue(
    			el:'#max',
    			data:
    				stat:true,
    			,
    			methods:
    				tiggleShow()
    					this.stat = !this.stat;
    				
    			
    		)
    	
    	</script>
    
    v-if与v-show区别:
      v-show指令的元素始终会被渲染到HTML
      它只是简单地为元素设置CSS的style属性。当不满足条件的元素被设置style="display:none"样式
      v-if指令满足条件是,会渲染到html中,不满足条件时,是不会渲染到html中的
    
    v-if 指令有更高的切换消耗
    v-if当条件成立的时候会将元素加上,不成立的时候,就会移除dom,并且内部的指令不会执行
    v-show 指令有更高的初始渲染消耗
    v-show只是简单的隐藏和显示
    如果需要频繁切换使用 v‐show 较好,如果在运行时条件不大可能改变 使用v‐if 较好
    
  • v-for 循环遍历 #*

    v-for的作用等同于js代码中的for循环,用于循环生成DOM结构,想循环哪个DOM结构,就在哪个DOM结构上添加v-for。

    但凡使用到v-for的地方 必须添加第二个属性 :key=‘id’

    <body>
        <div id="box">
            <!-- 遍历数组
            语法 v-for="(item,index) in arr"
                item 就表示数组中的每一个数据
                index表示下标
        -->
            <ul>
                <li v-for="(item,index) in arr">item</li>
            </ul>
            <!-- 遍历普通对象
                语法 v-for="(val,key,i) in arr"
                val 就表示对象中的每一个值
                key 就表示对象中的每一个键值
                i就是下标
            -->
            <ul>
                <li v-for="(val,key,i) in user">key--val--i</li>
            </ul>
    		<!-- 遍历字符串 -->
            <ul>
                <li v-for="(item,i) in str">item</li>
            </ul>
        </div>
        <script>
            let app = new Vue(
                el: '#box',
                data: 
                    arr: ['a', 'b', 'c'],
                    user:  "name": '张三', "age": 18, "address": '郑州' ,
                    str:'abcdefg'
                
            )
        </script>
    </body>
    
    
  • v-on 绑定事件和事件处理

    vue的绑定事件的方式,只需要把原生事件名字的on去掉就可以了

    例如: onclick === > @click/v-on:click onblur ===> @blur/v-on:blur

    • 普通用法

      为 HTML 元素绑定事件监听
      	v-on:事件名称 =‘函数名称()’
      		表达式可以是一个方法的名字或一个内联语句
      	简写语法:@事件名称 =‘函数名称()’
      	注意:函数定义在 methods 配置项中
      
      <button v-on:click='fn()'>toggle</button>
      v-on: 可以简写成 @
      <button @click='fn()'>toggle</button>
      
  • v-bind

    作用:为元素的属性 动态的绑定值

v-bind可以在其名称后面带一个参数,参数通常是HTML元素的属性(attribute),v-bind是动态绑定指令,默认情况下自带属性的值是固定的,为了能够动态的给这些属性添加/修改值可以使用v-bind指令
v-bind:属性名 = ‘表达式’
简写形式:v-bind可以省略,直接书写为 :属性名 = ‘表达式’
<img v-bind:src="imageSrc"> 等价于  <img :src="imageSrc">   //绑定一个属性

v-bind:绑定class

//对象语法
我们可以传给 v-bind:class 一个对象,以动态地切换 class:
格式:<div v-bind:class=" 类名: 布尔值 "></div>
//isActive是boolean属性的参数,为true就给div添加类名active,为false就不添加
<div v-bind:class=" active: isActive "></div>
可以同时绑定多个类名,也可以和静态类名同时存在
<div class="static" v-bind:class=" active: isActive, 'text-danger': hasError "></div>

//数组语法
我们可以把一个数组传给 v-bind:class,以应用一个 class 列表:
<div v-bind:class="[activeClass, errorClass]"></div>
 data: 
  activeClass: 'active',
  errorClass: 'text-danger'


<div v-bind:class="[isActive ? activeClass : '', errorClass]"></div>
//绑定多个属性
<div v-bind:class="'textColor':isColor, 'textSize':isSize">多个样式的绑定</div>

 <div id="box">
        <a :href="url" v-bind:class='classname'>点我</a>
    </div>
    <script>
        new Vue(
            el:'#box',
            data:
                url:'http://www.baidu.com',
                classname:['aaa','bbb','ccc']
            
        )
    </script>

v-bind:绑定内联样式

#对象语法
//v-bind:style 的对象语法十分直观——看着非常像 CSS,但其实是一个 JavaScript 对象。CSS property 名可以用驼峰式 (camelCase) 或短横线分隔 (kebab-case,记得用引号括起来) 来命名:
<div v-bind:style=" color: activeColor, fontSize: fontSize + 'px' "></div>
data: 
  activeColor: 'red',
  fontSize: 30

//直接绑定到一个样式对象通常更好,这会让模板更清晰:
<div v-bind:style="styleObject"></div>
data: 
  styleObject: 
    color: 'red',
    fontSize: '13px'
  


#数组语法
//v-bind:style 的数组语法可以将多个样式对象应用到同一个元素上:
<div v-bind:style="[styleObject,baseStyles, overridingStyles]"></div>
  • v-model

    你可以用 v-model 指令在表单 <input><textarea><select> 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇,但 v-model 本质上不过是语法糖。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。

    v-model 会忽略所有表单元素的 valuecheckedselected attribute 的初始值而总是将 Vue 实例的数据作为数据来源。你应该通过 JavaScript 在组件的 data 选项中声明初始值。

    v-model说白了就像监听器一样,会自动的将vue实例的值同步更新到表单中,同样的也会把表达中的值同步到vue实例中。

    这就是双向数据绑定。

    **注意:**只有表单元素使用v-model使用才有意义,因为只有表单元素才可以跟用户交互。别的元素使用只能显示数据,没有别的意义。

    对input框,操作的是value属性的值:

    <body>
        <div class="box">
            <input type="text" value="你好嘿嘿嘿" v-model='msg'>
            <br>
            msg
        </div>
        <script>
            new Vue(
                el:'.box',
                data:
                    msg:'你好哈哈哈'
                
            )
        </script>
    
```

对单个复选框操作的是 checked属性的值:

<body>
    <div class="box">
        <input type="checkbox" v-model='b'>
        <br>
      	b
    </div>
    <script>
        new Vue(
            el:'.box',
            data:
                b:''
            
        )
    </script>
</body>
此时vue实例中b的值会就跟复选框绑定到了一起。

对多个复选框操作如果在vue实例中是用一个数组接收,接收到是一个数组,里边包含的是被选中的复选框的vlaue值

<body>
    <div class="box">
        <input type="checkbox" value="1" v-model='b'>
        <input type="checkbox" value="2" v-model='b'>
        <input type="checkbox" value="3" v-model='b'>
        <br>
      	b
    </div>
    <script>
        new Vue(
            el:'.box',
            data:
                b:[]
            
        )
    </script>
  想让哪个框默认选中,就直接把这个框的值写入到vue的实例中去。

对于单选框来说,拿到的是被选中的那个单选框的value属性的值:

<body>
    <div class="box">
        <input type="radio" value="" name="sex" v-model="s"><input type="radio" value="" name="sex" v-model="s"><br>
       	s
    </div>
    <script>
        new Vue(
            el:'.box',
            data:
                s:""
            
        )
    </script>
</body>

对于下拉框来说,拿到的是被选中的那个选项的值

<body>
    <div class="box">
        <select name="" id="" v-model="selected" multiple>
            <option value="a">a</option>
            <option value="b">b</option>
            <option value="c">c</option>
            <option value="d">d</option>
        </select>
        <br>
        selected
    </div>
    <script>
        new Vue(
            el:'.box',
            data:
                selected:''
            
        )
    </script>
</body>
此时selected拿到的就是被选中的项的value值,如果是多选的下拉框,此时的selected值就是选中的多个框的value值。