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

这是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="root">
	<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模板中都可以直接使用。
  • MVVM模型图

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教程及资料。

欢迎交流

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羊and船

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值