欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

vue入门学习知识要点总结(一),理解Vue及其语法特点

程序员文章站 2022-03-04 10:44:14
...

这是Vue学习第一篇博文,主要是Vue的基础理解。后面会保持更新

1.1 简介

Vue.js 是什么

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

  • 通过对框架的了解与运用程度,来决定其在整个项目中的应用范围,最终可以独立以框架方式完成整个web前端项目。换而言之,就是一开始不需要你完全掌握它的全部功能特性,可以后续逐步增加功能。没有多做职责之外的事情(你可以只用我的一部分,而不是用了我这一点就必须用我的所有部分。)

初始Vue

  1. 想让Vue工作,就必须创建一个Vue实例,且要传入一个配置对象;
//创建Vue实例
new Vue({
	el:'#root', //el用于指定当前Vue实例为哪个容器服务,值通常为css选择器字符串。
	data:{ //data中用于存储数据,数据供el所指定的容器去使用,值我们暂时先写成一个对象。
		name:'hello',
		address:'广州'
	}
})
  1. root容器里的代码依然符合html规范,只不过混入了一些特殊的Vue语法,root容器里的代码被称为【Vue模板】;
<!-- 准备好一个容器 -->
<div id="demo">
	<h1>Hello,{{name.toUpperCase()}}{{address}}</h1>
</div>
  1. Vue实例和容器是一一对应的。真实开发中只有一个Vue实例,并且会配合着组件一起使用;

  2. {{xxx}}中的xxx要写js表达式,且xxx可以自动读取到data中的所有属性;

JS表达式:一个表达式会产生一个值,可以放在任何一个需要值的地方,eg: a, a+b, demo(1)

JS语句:执行一些操作,eg: if(){}, for(){}…

  1. 一旦data中的数据发生改变,那么页面中用到该数据的地方也会自动更新;

Vue 的特点

  1. 遵循 MVVM 模式
  • Model-View-ViewModel,本质上就是MVC 的改进版。核心理念就是通过 声明式的数据绑定 来实现 View 层和其他层的分离。

    声明式就像你告诉你朋友画一幅画,你不用去管他怎么画的细节

    命令式就像按照你的命令,你朋友一步步把画画出来

  1. 编码简洁, 体积小, 运行效率高, 适合移动/PC 端开发

  2. 本身只关注 UI, 也可以引入其它第三方库开发项

与其它 JS 框架的关联

  1. 借鉴 Angular 的模板和数据绑定技术
  2. 借鉴 React 的组件化和虚拟 DOM 技术

Vue 周边库

  1. vue-cli: vue 脚手架

  2. vue-resource

  3. axios

  4. vue-router: 路由

  5. vuex: 状态管理

  6. element-ui: 基于 vue 的 UI 组件库(PC 端)

1.2 模板语法

1)插值语法(双大括号表达式)

  • <h3>插值语法,你好,{{name}}</h3>  //data内应有name数据,或computed中有...等
    
  • 功能: 用于解析标签体内容

  • 语法: {{xxx}} ,xxxx 是js表达式,且可以直接读取到data中的所有属性。

2)指令语法(以 v-开头)

  • <a v-bind:href="school.url.toUpperCase()">点我去学校学习</a>  //v-bind:的简写为:
    
  • 功能: 解析标签属性、解析标签体内容、绑定事件

  • 语法:v-bind:href = ‘xxxx’ ,xxxx 会作为 js 表达式被解析 ,且可以直接读取到data中的所有属性。

  • 说明:Vue 中有很多的指令,此处只是用 v-bind 举个例

1.3 数据绑定

1)单向数据绑定

  • <input type="text" v-bind:value="name">  //单向数据绑定
    <!-- 简写:<input type="text" :value="name"><br/> -->
    
  • 语法:v-bind:href =“xxx” 或简写为 :href

  • 特点:数据只能从 data 流向页面

2)双向数据绑定

  • <input type="text" v-model:value="name">  //双向数据绑定
    <!-- 简写:<input type="text" v-model="name"><br/> -->
    
  • 语法:v-mode:value=“xxx” 或简写为 v-model=“xxx” 2

  • 特点:数据不仅能从 data 流向页面,还能从页面流向data

  • 双向绑定一般都应用在表单类元素上(如:input、select、value等)

1.4 el和data

1)选项/DOM:el

类型string | Element

限制:只在用 new 创建实例时生效。

详细:提供一个在页面上已存在的 DOM 元素作为 Vue 实例的挂载目标。可以是 CSS 选择器,也可以是一个 HTMLElement 实例。在实例挂载之后,元素可以用 vm.$el 访问。如果在实例化时存在这个选项,实例将立即进入编译过程,否则,需要显式调用 vm.$mount() 手动开启编译。

//el的两种写法
const vm = new Vue({
	//el:'#root', //第一种写法,实例化时存在这个选项,实例立即进入编译过程
	data:{
		name:'尚硅谷'
	}
})
console.log(vm) //vue的实例对象
vm.$mount('#root') //第二种写法,显式调用 vm.$mount() 手动开启编译

2)选项/数据:data

类型Object | Function

限制:组件的定义只接受 function

详细:Vue 实例的数据对象。

Vue 会递归地把 data 的 property 转换为 getter/setter,从而让 data 的 property 能够响应数据变化。对象必须是纯粹的对象 (含有零个或多个的 key/value 对):浏览器 API 创建的原生对象,原型上的 property 会被忽略。大概来说,data 应该只能是数据,不推荐观察拥有状态行为的对象。一旦观察过,你就无法在根数据对象上添加响应式 property。因此推荐在创建实例之前,就声明所有的根级响应式 property。

实例创建之后,可以通过 vm.$data 访问原始数据对象。Vue 实例也代理了 data 对象上所有的 property,因此访问 vm.a 等价于访问 vm.$data.a

_$ 开头的 property 不会被 Vue 实例代理,因为它们可能和 Vue 内置的 property、API 方法冲突。你可以使用例如 vm.$data._property 的方式访问这些 property。

当一个组件被定义,data 必须声明为返回一个初始数据对象的函数,因为组件可能被用来创建多个实例。如果 data 仍然是一个纯粹的对象,则所有的实例将共享引用同一个数据对象!通过提供 data 函数,每次创建一个新实例后,我们能够调用 data 函数,从而返回初始数据的一个全新副本数据对象。

如果需要,可以通过将 vm.$data 传入 JSON.parse(JSON.stringify(...)) 得到深拷贝的原始数据对象。

new Vue({
			el:'#root',
			//data的第一种写法:对象式
			/* data:{
				name:'尚硅谷'
			} */

			//data的第二种写法:函数式
			data(){
				console.log('@@@',this) //此处的this是Vue实例对象
				return{
					name:'尚硅谷'
				}
			}
		})

1.5 MVVM 模型

MVVM

  • M:模型(Model) :对应 data 中的数据
  • V:视图(View) :模板代码
  • VM:视图模型(ViewModel) : Vue 实例

观察发现

  • data中所有的属性,最后都出现在了vm身上。
  • vm身上所有的属性 及 Vue原型上所有属性,在Vue模板中都可以直接使用。
  • vue入门学习知识要点总结(一),理解Vue及其语法特点

1.6 数据代理

回顾Object.defineproperty方法

let number = 18,person = {}
Object.defineProperty(person,'age',{
	// value:18,
	// enumerable:true, //控制属性是否可以枚举,默认值是false
	// writable:true, //控制属性是否可以被修改,默认值是false
	// configurable:true //控制属性是否可以被删除,默认值是false

	//当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
	get(){
		console.log('get')
		return number
	},

	//当有人修改person的age属性时,set函数(setter)就会被调用,get不被调用,且会收到修改的具体值
	set(value){
		console.log('set',value)
		number = value
	}
})
console.log(person.age)  //get     18
console.log(person.age = 10) // set 10     10
console.log(person.age) // get    10

拓展:

  1. 对象常量
    结合writable:false和configurable:false就可以创建一个真正的常量属性(不可修改、重定义或者删除):
    var myObject = {};

    Object.defineProperty(myObject, "FAVORITE NUMBER", {
        value: 42,
        writable: false,
        configurable: false
    } );
  1. 禁止扩展
    如果你想禁止一个对象添加新属性并且保留已有属性,可以使用Object.preventExtensions(…):
    var myObject = {
        a:2
    };

    Object.preventExtensions(myObject);

    myObject.b = 3; //在非严格模式下,创建属性b会静默失败。在严格模式下,将会抛出TypeError错误。
    myObject.b; // undefined
  1. 密封
    Object.seal(…)会创建一个“密封”的对象,这个方法实际上会在一个现有对象上调用Object.preventExtensions(…)并把所有现有属性标记为configurable:false。
    所以,密封之后不仅不能添加新属性,也不能重新配置或者删除任何现有属性(虽然可以修改属性的值)。

  2. 冻结
    Object.freeze(…)会创建一个冻结对象,这个方法实际上会在一个现有对象上调用Object.seal(…)并把所有“数据访问”属性标记为writable:false,这样就无法修改它们的值。

  3. 以上操作都只会影响目标对象和它的直接引用对象。如果目标对象引用了其他对象,其他对象的内容不受影响,仍然是可变的。

数据代理

数据代理:通过一个对象代理对另一个对象中属性的操作(读/写)

  • let obj = {x:100}
    let obj2 = {y:200}
    
    Object.defineProperty(obj2,'x',{
    	get(){
    		console.log('get');
    		return obj.x
    	},
    	set(value){
    		console.log('set')
    		obj.x = value
    	}
    })
    

Vue中的数据代理:通过vm对象来代理data对象中属性的操作(读/写),好处是更方便操作data中的数据

基本原理:通过Object.defineProperty()把data对象中所有属性添加到vm上。为每一个添加到vm上的属性,都指定一个getter/setter。在getter/setter内部去操作(读/写)data中对应的属性。

本文参考了vue官方文档及尚硅谷张天禹老师的vue教程及资料。

欢迎交流