vue.js基础

226 阅读7分钟

什么是Vue?

Vue是一套用于构建用户界面的前端渐进式框架

用户界面:用vue往html页面中填充数据,非常的方便。

框架:框架是一套现成的解决方案,可以根据框架的规范编写功能。

vue的特性

  1. 数据驱动视图:数据的变化会驱动视图的自动更新

好处:只需要维护好数据,页面结构会别vue自动渲染。

数据驱动视图是单向的数据绑定

  1. 双向数据绑定:在网页中form表单负责采集数据,ajax负责提交数据

好处:开发者不再需要手动操作DOM元素,来获取表单最新的值。

注意:数据驱动视图和双向数据绑定的底层原理是MVVM(Mode数据源、View视图、ViewMode就是vue的实例)

Vue的指令

1. 内容渲染指令

(1) v-text指令的缺点:会覆盖元素中原有内容,很少使用

//把username对应的值,渲染到一个p标签中
<p v-text="username"></p>

//如果标签里面有默认文本“年龄”,会被age的值覆盖
<p v-text="age">18</p>

(2) {{}}语法,名称是插值表达式(Mustache),只能用在内容节点中

//将对应的值渲染到元素的内容节点中,同时保留自身的默认值
<p>姓名:{{username}}</p>
<p>年龄:{{age}}</p>

(3) v-html 把包含html标签的字符串渲染为页面的HTML元素,v-text指令和插值表达式只能渲染纯文本内容。

//如果data中定义了一个包含HTML标签的字符串
<p v-html='el'></p>

const app = Vue.createApp({
	data() {
  	retuen {
    	el:'<h5 style="color:red;">消息</h5>'
    }
  }
}).mount(#app)

2. 属性绑定指令

(1) v-bind:指令,可以为元素的属性动态绑定属性值(简写形式英文的(:) )

//如果data中定义了input和imgsrc
const app = Vue.createApp({
	data() {
  	retuen {
      input:'请输入内容'imgsrc:'https://cn.vue.js.org/images/logo.png'
    }
  }
}).mount(#app)
         
//使用v-bind:指令,为input的placeholder动态绑定属性值
<inpu type="text" v-bind:placeholder="input" />
         
//使用v-bind:指令,为img的src动态绑定属性
<img v-bind:src="imgsrc" />

(2) v-bind动态改变类,多类名写法

<p :class="{red:isRed,f60:isF60}">{{msg}}</p>

data() {
	return: {
  	msg:'内容'red:'red',
    f60:'f60',
    isRed:true,
    isF60:true
  }
}

//还可以这样写,不会覆盖掉class属性
<p class="box" :class="{red:isRed,f60:isF60}">{{msg}}</p>

//还有一种数组写法
<p class="[red,f60]">{{msg}}</p>

(3) Vue提供的模板渲染语法中,除了支持绑定简单的数据值之外,还支持JavaScript表达式的运算

{{number + 1}}

{{ok ? 'yes' : 'no'}}

{{msg.split('').reverse().join('')}}

<div v-bind:id="'list-'+id"></div>

3.事件绑定指令

(1) v-on:事件绑定指令,用来为DOM元素绑定事件监听(简写形式英文的(@) )

<div>count的值为:{{count}}</div>
//语法格式为:v-on:事件名称="事件处理函数名称"
<button v-on:click="fn"></div> //onmousemove等同理

(2) 通过v-on:绑定的事件处理函数,需要在methods节点中进行声明,而且与data平级

const app = Vue.createApp({
	data() {
  	return {
    	count:0
    }
  },
  methods: {
  	fn() {    //事件处理函数名字
    	this.count+1 //可以this访问到data中的数据
    }
  }
})

事件对象event,v-on:指令可以接收到事件对象event

  methods: {
  	fn(e) { //接收事件参数对象event,简写为 e
      const bgcolor = e.target.style.backgroundColor
      e.target.style.backgroundColor = bgcolor === 'red' ? '' : 'red'
    	this.count+1 
    }
  }

$event是vue提供的特殊变量,表示原生的事件参数对象event,用来防止event被覆盖

<div v-on:click="fn(2,$event)"></div>

methods: {
	fn(x,e) {
  	const bgcolor = e.target.style.backgroundColor
      e.target.style.backgroundColor = bgcolor === 'red' ? '' : 'red'
    	this.count+x 
  }
}

(3) 计算属性:computed

<div>{{fullName}}</div>

const app = Vue.createApp({
	data() {
  	return {
    	firstName:'泰勒'lastName:'史薇芙特'
    }
  },
  computed: {
    //细节:本质上还是属性,写法如函数,命名如属性
  	fullName() {    
			return this.firstName + '・' + this.lastName
    }
  }
})

(4) 计算属性和函数的区别:

如果需要计算一个复杂数据很多次,用函数会重复计算很多次,而计算属性会缓存属性结果,如果多次调用,如果数据没有发生改变,计算属性只会运算一次,而函数则会调用多少次,就计算多少次

 <div id="app">
    <p>计算属性</p>
    <p>{{fullName}}</p>
    <p>{{fullName}}</p>
    <p>{{fullName}}</p>
    <p>函数</p>
    <P>{{msg()}}</P>
    <P>{{msg()}}</P>
    <P>{{msg()}}</P>
  </div>

 const app = Vue.createApp({
      data() {
        return {
          firstName: '泰勒',
          lastName: '史薇芙特'
        }
      },
      computed: {
        //细节:本质上还是属性,写法如函数,命名如属性
        fullName() {
          console.log("—————fullName()—————")  //会打印一次
          return this.firstName + '・' + this.lastName
        }
      },
      methods: {
        msg() {
          console.log("————msg()——————")   //会打印三次
          return this.firstName + '・' + this.lastName
        }
      }
    }).mount('#app')

事件修饰符

在事件处理函数中调用preventDefault()或stopPropagation()是非常常见的需求。因此Vue提供了修饰符的概念

一、.prevent:阻止默认行为(例如:阻止a链接跳转、阻止表单的提交等)

二、.stop:阻止事件冒泡

三、.capture:以捕获模式触发当前的时间处理函数

四、.once:绑定的事件只触发一次

五、.self:只有在event.target是当前元素自身时触发事件处理函数

调用方法:

//v-on:绑定事件.修饰符=“事件处理函数”
@click.prevent="fn"

按键修饰符

在监听键盘事件时,经常需要判断详细的按键

//当按下enter键的时候,触发submit这个函数,当按下esc触发clearinput
<input @keyup.enter="submit" @keyup.esc="clearinput"/>

4. 双向绑定指令

(1) v-model双向绑定指令,不用操作DOM的前提下,快速获取表单数据

//表单里面会显示用户名,如果在表单里面修改用户名,p标签的用户名也会改变
<p>用户名:{{username}}</p>
<input type="text" v-model="username"/>
//v-model指令只能配合表单元素一起使用

(2) v-model的实现原理

//用v-bind将input绑定msg值
//当往input中输入内容时就会触发@input事件,这时给msg赋值为input的value值,就能双向绑定了
<input type="text" :value="msg" @input=“msg=$event.target.value”/>
 <p>{{msg}}</p>

v-model指令的修饰符:

一、.number:自动将用户的输入值转为数值类型

二、.trim: 自动过滤用户输入的首尾空表字符

三、.lazy: 在“change”时而非’input时更新‘

<input v-model.number="age"/>

5. 条件渲染指令

按需控制DOM的显示和隐藏,有两个指令:

(1)v-if

(2)v-show

<button @click="flag=!flag"></button>

<p v-if="flag">被v-if控制</p>
<p v-show="flag">被v-show控制</p>
//如果flag为true时显示元素,如果flag为false时隐藏元素

v-if与v-show的区别:

v-if是动态的创建或移出DOM元素,从而控制元素在页面上的显示与隐藏;

v-show是动态给元素添加或移出style="display或none";样式。

v-if有更高的切换开销,而v-show有更高的初始渲染开销(如果第一次为false也会创建)。

(3) v-else,可以配合v-if使用,还有v-else-if,就想js中的else if一样

<p v-if="flag">被v-if控制</p>
<p v-else="flag">被v-else控制</p>
//如果flag为true时显示v-if元素,如果flag为false时v-else元素

6. 列表渲染指令

vue提供了v-for指令,基于一个数组来循环渲染相似的UI机构。

v-for指令需要使用item in items的特殊语法:

(1) items 是待循环的数组

(2) item 是当前的循环项

data() {
	list: [ //构建数组
    {id:1,name:'zs'},
    {id:2,name:'ls'}
  ]
}

<div v-for="item in list">姓名是:{{name:item}}</div>

v-for中的索引:(item,index) in items--给v-for第二个参数就可以拿到数组的索引。

v-for使用key维护列表的状态:

当列表数据改变时,默认情况下,Vue会尽可能的复用已存在的DOM元素,从而提升渲染的性能,但是会导致有状态的列表无法被正确更新。所以需要给每一项提供一个唯一的key属性,保证有状态的列表被正确更新。

<div v-for="user in userlist" key="user.id">{{user.name}}</div>

使用key属性的注意事项:

1 key的值只能是字符串或数字类型;

2 key的值必须具有唯一性(key不能重复);

3 建议把数据项的id属性的值作为key的值(因为id的属性的值具有唯一性);

4 使用index的值当作key的值没有任何意义(因为index的值不具有唯一性);

5 使用v-for指令时一定要指定key的值(即提升性能,又防止列表状态混乱)

其他一些指令

  1. v-pre: 不会解析,不会产生编译
<p v-pre>不产生编译:{{msg}}</p>  //不会解析{{}}语法,会直接返回{{msg}}
  1. v-cloak:vue实例解析之前,给div标签设置一个v-cloak属性,当数据加载完后,vue会自动删除这个v-cloak。让div数据还没出来的隐藏,防止加载出{{msg}}
//style样式
[v-cloak]{display:none;}

<div v-cloak>{{msg}}</div>