Vue基础语法知识梳理上篇

目录
  • Vue简介
  • 模板语法
  • 数据绑定
  • el与data的两种写法
  • Vue中的MVVM
  • 数据代理
  • 事件处理

Vue简介

  • 让Vue工作,就须创建一个Vue实例,且要传入一个配置对象
  • demo容器里的代码符合html规范,只不过混入了一些特殊的Vue语法
  • demo容器里的代码被称为【Vue模板】
  • Vue实例和容器是一一对应的
  • 真实开发中只有一个Vue实例,并且会配合着组件一起使用
  • {{xxx}}是Vue的语法:插值表达式,{{xxx}}可以读取到data中的所有属性
  • 一旦data中的数据发生改变,那么页面中用到该数据的地方也会自动更新(Vue实现的响应式)
<!-- 准备好一个容器 -->
<div id="demo">
	<h1>Hello,{{name.toUpperCase()}},{{address}}</h1>
</div>
<script type="text/javascript" >
	Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
	//创建Vue实例
	new Vue({
		el:'#demo', //el用于指定当前Vue实例为哪个容器服务,值通常为css选择器字符串。
		data:{ //data中用于存储数据,数据供el所指定的容器去使用,值我们暂时先写成一个对象。
			name:'hello,world',
			address:'北京'
		}
	});
</script>

模板语法

(1)插值语法:

功能:用于解析标签体内容

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

(2)指令语法:

功能:用于解析标签(包括:标签属性、标签体内容、绑定事件…)

举例:v-bind:href=“xxx” 或 简写为

:href=“xxx”,xxx同样要写js表达式,且可以直接读取到data中的所有属性

<div id="root">
	<h1>插值语法</h1>
	<h3>你好,{{name}}</h3>
	<hr/>
	<h1>指令语法</h1>
    <!-- 这里是展示被Vue指令绑定的属性,引号内写的是js表达式 -->
	<a :href="school.url.toUpperCase()" rel="external nofollow"  x="hello">点我去{{school.name}}学习1</a>
	<a :href="school.url" rel="external nofollow"  x="hello">点我去{{school.name}}学习2</a>
</div>
<script>
    new Vue({
		el:'#root',
		data:{
			name:'jack',
			school:{
				name:'百度',
				url:'http://www.baidu.com',
			}
        }
	})
</script>

数据绑定

(1)单向绑定(v-bind):数据只能从data流向页面

(2)双向绑定(v-model):数据不仅能从data流向页面,还可以从页面流向data

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

2.v-model:value 可以简写为 v-model,因为v-model默认收集的就是value值

<div id="root">
	<!-- 普通写法 单向数据绑定 -->
    单向数据绑定:<input type="text" v-bind:value="name"><br/>
    双向数据绑定:<input type="text" v-model:value="name"><br/>
    <!-- 简写 v-model:value 可以简写为 v-model,因为v-model默认收集的就是value值-->
    单向数据绑定:<input type="text" :value="name"><br/>
    双向数据绑定:<input type="text" v-model="name"><br/>
</div>
<script>
    new Vue({
		el:'#root',
		data:{
			name:'jack',
        }
	})
</script>

el与data的两种写法

(1)el有2种写法

  • new Vue时候配置el属性
  • 先创建Vue实例,随后再通过vm.$mount(‘#root’)指定el的值
<script>
   	// 第一种
	const vm = new Vue({
		el:'#root',
		data:{
			name:'jack',
        }
	})
    // 第二种
    vm.$mount('#root')
</script>

(2)data有2种写法

  • 对象式
  • 函数式

在组件中,data必须使用函数式

<script>
    new Vue({
		el:'#root',
        // 第一种
		data:{
			name:'jack',
        }
        // 第二种
        data() {
        	return {
                name: 'jack'
            }
    	}
	})
</script>

Vue中的MVVM

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

数据代理

了解数据代理需要js的一些知识:Object.defineProperty(),属性标志,属性描述符,getter,setter

属性标志:

对象属性(properties),除 value 外,还有三个特殊的特性(attributes),也就是所谓的“标志”

  • writable — 如果为 true,则值可以被修改,否则它是只可读的
  • enumerable — 如果为 true,则表示是可以遍历的,可以在for… .in Object.keys()中遍历出来
  • configurable — 如果为 true,则此属性可以被删除,这些特性也可以被修改,否则不可以

Object.getOwnPropertyDescriptor(obj, propertyName)

这个方法是查询有关属性的完整信息 obj是对象, propertyName是属性名

let user = {
  name: "John"
};
let descriptor = Object.getOwnPropertyDescriptor(user, 'name');
console.log(descriptor)
/* 属性描述符:
{
  "value": "John",
  "writable": true,
  "enumerable": true,
  "configurable": true
}
*/

Object.defineProperty(obj, prop, descriptor)

obj:要定义属性的对象。

prop:要定义或修改的属性的名称

descriptor:要定义或修改的属性描述符

let user = {
  name: "John"
};
Object.defineProperty(user, "name", {
  writable: false
});
user.name = "Pete";
// 打印后还是显示 'John',无法修改name值

其他的属性标志就不演示了,接下来看重点:访问器属性。

访问器属性:

本质上是用于获取和设置值的函数,但从外部代码来看就像常规属性。

访问器属性由 “getter” 和 “setter” 方法表示。在对象字面量中,它们用 getset 表示:

let obj = {
    get name() {
        // 当读取 obj.propName 时,getter 起作用
    },
    set name() {
        // 当执行 obj.name = value 操作时,setter 起作用
    }
}

更复杂一点的使用

let user = {
	surname: 'gao',
    name: 'han'
    get fullName() {
        return this.name + this.surname;
    }
}
console.log(user.fullName)

从外表看,访问器属性看起来就像一个普通属性。这就是访问器属性的设计思想。我们不以函数的方式 调用 user.fullName,我们正常 读取 它:getter 在幕后运行。

截至目前,fullName 只有一个 getter。如果我们尝试赋值操作 user.fullName=,将会出现错误:

user.fullName = "Test"; // Error(属性只有一个 getter)

user.fullName 添加一个 setter 来修复它:

let user = {
	surname: 'gao',
    name: 'han'
    get fullName() {
        return this.name + ' ' + this.surname;
    }
	set fullName(value) {
        // 这个用到了新语法 结构赋值
        [this.surname, this.name] = value.split(' ');
    }
}
user.fullName = 'Li Hua'
console.log(user.name);
console.log(user.surname);

数据代理:

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

例:
let obj = {
    x: 100
}
let obj2 = {
    y: 200
}

我们想要访问 **obj** 中的 **x** 的值,但我们最好不要直接去访问 **obj** ,而是想要通过 **obj2** 这个代理对象去访问。

这时候就可以用上 Object.defineProperty(),给 obj2 添加访问器属性(也就是getter和setter)

代码

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

Vue中的数据代理

Vue中的数据代理:通过vm对象来代理data对象中属性的操作(读/写)

Vue中数据代理的好处:更加方便的操作data中的数据

基本原理:

  • 通过Object.defineProperty()把data对象中所有属性添加到vm上。
  • 为每一个添加到vm上的属性,都指定一个getter/setter。
  • 在getter/setter内部去操作(读/写)data中对应的属性。
<!-- 准备好一个容器-->
<div id="root">
	<h2>学校名称:{{name}}</h2>
	<h2>学校地址:{{address}}</h2>
</div>
<script>
	const vm = new Vue({
        el: '#root',
        data: {
            name: '浙江师范大学',
            address: '浙江金华'
        }
    })
</script>

我们在控制台打印 new 出来的 vm

可以看到,写在配置项中的 data 数据被 绑定到了 vm 对象上,我先来讲结果,是 Vue 将 _data 中的 name,address 数据 代理到 vm 本身上。

先来解释下_data 是啥, _data 就是 vm 身上的 _data 属性,就是下图那个

这个 _data 是从哪来的?

<script>
	const vm = new Vue({
        el: '#root',
        // 我们在Vue 初始化的配置项中写了 data 属性。
        data: {
            name: '浙江师范大学',
            address: '浙江金华'
        }
    })
</script>

new Vue 时, Vue 通过一系列处理, 将匹配项上的 data 数据绑定到了 _data 这个属性上,并对这个属性进行了处理(数据劫持),但这个属性就是来源于配置项中的 data,我们可以来验证一下。

<script>
    let data1 = {
        name: '浙江师范大学',
        address: '浙江金华'
    }
	const vm = new Vue({
        el: '#root',
        // 我们在Vue 初始化的配置项中写了 data 属性。
        data: data1
    })
</script>

这一切都是通过 Object.defineProperty() 来完成的,我来模拟一下这个过程

Object.defineProperty(vm, 'name', {
    get() {
        return vm._data.name;
    },
    set(value) {
        vm._data.name = value
    }
})

在插值语法中,{{ name }} 取到的值就相当于 {{ vm.name }},不用数据代理的话,在插值语法就要这样去写了。

事件处理

事件的基本使用:

  • 使用v-on:xxx 或 @xxx 绑定事件,其中xxx是事件名
  • 事件的回调需要配置在methods对象中,最终会在vm上
  • methods中配置的函数,都是被Vue所管理的函数,this的指向是vm 或 组件实例对象
<!-- 准备好一个容器-->
<div id="root">
    <h2>欢迎来到{{name}}学习</h2>
    <!-- <button v-on:click="showInfo">点我提示信息</button> -->
    <button @click="showInfo1">点我提示信息1(不传参)</button>
    <!-- 主动传事件本身 -->
    <button @click="showInfo2($event,66)">点我提示信息2(传参)</button>
</div>
<script>
	const vm = new Vue({
        el:'#root',
        data:{
            name:'vue',
        },
        methods:{
            // 如果vue模板没有写event,会自动传 event 给函数
            showInfo1(event){
                // console.log(event.target.innerText)
                // console.log(this) //此处的this是vm
                alert('同学你好!')
            },
            showInfo2(event,number){
                console.log(event,number)
                // console.log(event.target.innerText)
                // console.log(this) //此处的this是vm
                alert('同学你好!!')
            }
        }
	});
</script>

Vue中的事件修饰符

  • prevent:阻止默认事件(常用)
  • stop:阻止事件冒泡(常用)
  • once:事件只触发一次(常用)
<div id="root">
    <h2>欢迎来到{{name}}学习</h2>
    <!-- 阻止默认事件(常用) -->
	<a href="http://www.baidu.com" rel="external nofollow"  @click.prevent="showInfo">点我提示信息</a>
    <!-- 阻止事件冒泡(常用) -->
    <div class="demo1" @click="showInfo">
        <button @click.stop="showInfo">点我提示信息</button>
        <!-- 修饰符可以连续写 -->
        <!-- <a href="http://www.atguigu.com" rel="external nofollow"  @click.prevent.stop="showInfo">点我提示信息</a> -->
    </div>
    <!-- 事件只触发一次(常用) -->
    <button @click.once="showInfo">点我提示信息</button>
</div>

到此这篇关于Vue基础语法知识梳理上篇的文章就介绍到这了,更多相关Vue语法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Vue中的基础过渡动画及实现原理解析

    前言 在日常开发中 动画是必不可少的一部分 不仅能让元素直接的切换显得更加自然 同时也能极大的增强用户体验 因此 在Vue之中也提供了非常强大的关于动画这方面的支持 Vue不仅支持用CSS来写一些过渡效果 同时也是支持JS的 不过在这个文章中讲述的都是如何利用CSS来实现过渡动画.keyframes动画以及实现的原理 过渡动画实现的原理 1.首先最基础的一点在于 如果你想要在单元素/单个组件之中实现过渡动画 那么 你需要在元素/组件所在的HTML标签之外包裹一层  <transition>标签

  • vue-router相关基础知识及工作原理

     前言 今天面试被问到 vue的动态路由,我竟然没有回答上来,感觉不是什么难得问题.好久没有看vue-router的文档,很多用的东西和概念没有对上.回来一看什么是动态路由就傻眼了.看来有必要把vue -router相关知识总结一下,好丢人的感觉. 单页面应用的工作原理 我理解的单页面工作原理是通过浏览器URL的#后面的hash变化就会引起页面变化的特性来把页面分成不同的小模块,然后通过修改hash来让页面展示我们想让看到的内容. 那么为什么hash的不同,为什么会影响页面的展示呢?浏览器在这里

  • vue中view-model双向绑定基础原理解析

    利用Object.defineProperty进行数据劫持 代码如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Vue

  • Vue基础语法知识梳理下篇

    目录 计算属性 键盘事件 监视属性 绑定样式 class样式 style样式 条件渲染 v-if v-show 列表渲染 v-for指令 vue监测data中的数据 收集表单数据 计算属性 定义:要用的属性不存在,要通过已有属性计算得来 原理:底层借助了Objcet.defineProperty方法提供的getter和setter get函数什么时候执行? (1).初次读取时会执行一次 (2).当依赖的数据发生改变时会被再次调用 注: 计算属性最终会出现在vm上,直接读取使用即可 如果计算属性要

  • 教你用Vue基础语法来写一个五子棋小游戏

    目录 前言 1.绘制游戏区域和游戏元素 2.点击事件 3.悔棋功能 4.判断胜负 写在最后 前言 在之前的文章中,用JS的基础语法写了一个五子棋小游戏# 如何使用原生JS,快速写出一个五子棋小游戏今天用Vue的基础语法来写一个,感受一下两者的区别..至于怎么判断胜负,我还是把上篇文章的方法复制粘贴过来了,如果想了解这个逻辑,可以看我之前的那篇文章. 1.绘制游戏区域和游戏元素 开始写代码之前,一定要记得先导包Vue文件.棋盘还是用二维数组来渲染,可以使用Array(15).fill(0).map

  • SQL查询语法知识梳理总结

    目录 基本查询 条件查询 常用的条件表达式 投影查询 排序 分页查询 聚合查询 分组 多表查询 连接查询 小结 基本查询 SELECT * FROM <表名> select也可以用作计算,但不是他的强项,select语句可以用来判断数据库的连接是否有效例如:许多检测工具会执行一条SELECT 1;来测试数据库连接. 条件查询 SELECT * FROM <表名> WHERE <条件表达式> 条件表达式可以用<条件1> AND <条件2>表达满足条

  • 又一款MVVM组件 Vue基础语法和常用指令(1)

    前言:关于Vue框架,好几个月之前就听说过,了解一项新技术之后,总是处于观望状态,一直在犹豫要不要系统学习下.正好最近有点空,就去官网了解了下,看上去还不错的一个组件,就抽空研究了下.最近园子里vue也确实挺火,各种入门博文眼花缭乱,博主也不敢说写得多好,就当是个学习笔记,有兴趣的可以看看. 一.MVVM大比拼 关于MVVM,原来在介绍knockout.js的时候有过讲解,目前市面上比较火的MVVM框架也是一抓一大把,比如常见的有Knockout.js.Vue.js.React.Angularj

  • vue基础语法之插值表达式详解

    目录 一.vscode插件介绍 二.插值表达式介绍 三.插值表达式示例1 四.插值表达式示例2 五.插值表达式注意点 六.插值表达式补充 总结 一.vscode插件介绍 在我们演示插值表达式之前,我们先安装这一个VScode给我们提供的插件,它可以将我们书写好的网页通过服务端口的方式进行访问,同时它的好处还有:再修改代码后,不需要我们手动点击刷新,插件会帮我们自动进行刷新,是不是非常方便,提高了我们的开发效率,节省了我们每次修改代码都要点击一次刷新的操作. 安装步骤如下图所示:安装Live Se

  • vue组件入门知识全梳理

    组件 概念:template是入口组件,那么挂载在template下的组件是入口组件的子组件 局部组件 三步口诀:声子,挂子,用子 声明一个局部组件,变量名首字母大写(为了和H5标签做区分),里面的内容和vue实例化对象的内容相似,但是不需要el,data必须是一个函数,函数返回一个对象 把组件挂载到入口文件的components对象中. 在入口文件的template中使用,可以是双闭合标签也可以是单闭合标签 全局组件 Vue.component(name,options) 第一个参数是组件的名

  • Vue开发指南之重点知识梳理

    概述 如果您是Vue开发的新手,您可能已经听过很多关于它的专业术语了,例如:单页面应用程序.异步组件.服务器端呈现等. 另外您可能还经常听到和Vue一起提到的工具和库,如Vuex.Webpack.Vue CLI和Nuxt. 也许您在面对这些未知的术语和工具时会感到无助和绝望,没关系,您并不孤单,因为这是所有新手在初次接触Vue时都会有的感受. 但如果您试图要一次掌握所有这些内容,那么这些庞大的体系很可能会压垮你.为此,我在这里将为大家展示一个"知识图表",它包含了所有在专业Vue开发过

  • vue.js入门教程之基础语法小结

    前言 Vue.js是一个数据驱动的web界面库.Vue.js只聚焦于视图层,可以很容易的和其他库整合.代码压缩后只有24kb. 以下代码是Vue.js最简单的例子, 当 input 中的内容变化时,p 节点的内容会跟着变化. <!-- html --> <div id="demo"> <p>{{message}}</p> <input v-model="message"> </div> new

  • 最细致的vue.js基础语法 值得收藏!

    介绍 前段时间接触到一个库叫做Vue.js, 个人感觉很棒,所以整理了一篇博文做个介绍. Vue读音/vju:/,和view类似.是一个数据驱动的web界面库.Vue.js只聚焦于视图层,可以很容易的和其他库整合.代码压缩后只有24kb. 可以去 这里下载 .自己整理了一个Vue.js的demo, https://github.com/chenhao-ch/demo-vue 快速入门 以下代码是Vue.js最简单的例子, 当input中的内容变化时,p节点的内容会跟着变化. <!-- html

  • Javascript基础知识(一)核心基础语法与事件模型

    一.Javascript核心基础语法 1.Javascript是一门增加交互效果的编程语言,它最初由网景公司发明,最后提交给ECMA(欧洲计算机制造商协会),ECMA将Javascript标准化,其命名为Javascript. 2.Javascript是一门解释性语言,无需编译就可以直接在浏览器下运行. 3.Javascript的用途? 1.可以控制网页中所有元素,增加.删除.修改元素的属性. 2.可以在html中放入动态文本. 3.响应用户在使用网页时产生的事件. 4.校验用户输入的数据. 5

随机推荐