Vue 实例

创建第一个实例

{{}} 被称之为插值表达式。可以用来进行文本插值。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Vue入门</title>
  8. <script src="./vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="root">{{msg}}</div>
  12.  
  13. <script>
  14. new Vue({
  15. el: "#root",
  16. data: {
  17. msg: "hello world"
  18. }
  19. })
  20. </script>
  21. </body>
  22. </html>

JSbin 预览

实例、挂载点、模板

实例里,需指定挂载点,模板

 

模板指的是挂载点内部的内容:

  • 可以写在挂载点内部
  • 也可以写在实例的 template 属性里面
  1. <script src="./vue.js"></script>
  2. <div id="root"></div>
  3. <script>
  4. new Vue({
  5. el: "#root",
  6. template: '<h1>hello {{msg}}</h1>',
  7. data: {
  8. msg: "world"
  9. }
  10. })
  11. </script>

JSbin 预览

数据展示 事件绑定 方法定义

v-text / v-html

类似于原生JS中的 innerText 与 innerHtml

JSbin 预览

  1. <script src="./vue.js"></script>
  2. <div id="root">
  3. <div v-text="content"></div>
  4. </div>
  5. <script>
  6. new Vue({
  7. el: "#root",
  8. data: {
  9. content: "<h1>hello world</h1>"
  10. }
  11. })
  12. </script>

JSbin 预览

  1. <script src="./vue.js"></script>
  2. <div id="root">
  3. <div v-html="content"></div>
  4. </div>
  5. <script>
  6. new Vue({
  7. el: "#root",
  8. data: {
  9. content: "<h1>hello world</h1>"
  10. }
  11. })
  12. </script>

v-on 事件

通过 v-on 给元素绑定事件,事件触发之后执行的方法写在 Vue 实例里面的 methods 方法里,这样方法里面的事件就可以执行了。

  1. <script src="./vue.js"></script>
  2. <body>
  3. <div id="root">
  4. <div v-on:click="handleClick">{{content}}</div> <!-- 添加v-on:click事件 -->
  5. </div>
  6. <script>
  7. new Vue({
  8. el: "#root",
  9. data: {
  10. content: "click me"
  11. },
  12. methods: {
  13. handleClick: function() {
  14. alert(123)
  15. }
  16. }
  17. })
  18. </script>
  19. </body>

JSbin 预览

Vue 中的 DOM 改动

在Vuejs中想要改变数据的显示,不要去改变 DOM。直接改变数据即可。当数据发生变化的时候,Vue会自己去改变 DOM。

  1. <script src="./vue.js"></script>
  2. <body>
  3. <div id="root">
  4. <div v-on:click="handleClick">{{content}}</div>
  5. </div>
  6. <script>
  7. new Vue({
  8. el: "#root",
  9. data: {
  10. content: "click me"
  11. },
  12. methods: {
  13. handleClick: function() {
  14. alert('yes')
  15. this.content = "clicked" //改变数据
  16. }
  17. }
  18. })
  19. </script>
  20. </body>

JSbin 预览
从这个案例可以看出 Vuejs 不再面向 DOM 进行操作,而是面向数据进行操作。

@

v-on: 可以简写成 @,即

  1. <script src="./vue.js"></script>
  2. <body>
  3. <div id="root">
  4. <div @click="handleClick">{{content}}</div>
  5. </div>
  6. <script>
  7. new Vue({
  8. el: "#root",
  9. data: {
  10. content: "click me"
  11. },
  12. methods: {
  13. handleClick: function() {
  14. alert('yes')
  15. this.content = "clicked" //改变数据
  16. }
  17. }
  18. })
  19. </script>
  20. </body>

属性绑定和双向数据绑定

属性绑定 v-bind:

当鼠标放置到这个div上的时候,会显示出title,内容是 this is hello world

  1. <script src="./vue.js"></script>
  2. <body>
  3. <div id="root">
  4. <div title="this is hello world">hello world</div>
  5. </div>
  6.  
  7. <script>
  8. new Vue({
  9. el: "#root"
  10. })
  11. </script>
  12. </body>

我们希望title可变,所以我们在实例里面,去定义一个 title。并使用 v-bind:将 title与 title 数据项做一个绑定。 如果想改变内容,只需要改变title的数据就可以了。

  1. <script src="./vue.js"></script>
  2. <body>
  3. <div id="root">
  4. <div v-bind:title="title">hello world</div> <!-- 使用v-bind:进行绑定 -->
  5. </div>
  6.  
  7. <script>
  8. new Vue({
  9. el: "#root",
  10. data: {
  11. title: "this is hello world"
  12. }
  13. })
  14. </script>
  15. </body>

JSbin 预览

当使用类似于 v-bind:title 的模板指令,相应的=后面的内容就不再是一个字符串,而是一个 JS 的表达式。
v-bind:title="title" 后面的"title" 表示实例中 data 里面的 title

v-bind:可以简写成:,即

  1. <script src="./vue.js"></script>
  2. <body>
  3. <div id="root">
  4. <div :title="title">hello world</div> <!-- 使用 :title 进行绑定 -->
  5. </div>
  6.  
  7. <script>
  8. new Vue({
  9. el: "#root",
  10. data: {
  11. title: "this is hello world"
  12. }
  13. })
  14. </script>
  15. </body>

双向数据绑定 v-model

在这个案例中,有一个input标签,使用 :value="content" 数据进行绑定

  1. <script src="./vue.js"></script>
  2. <body>
  3. <div id="root">
  4. <div :title="title">hello world</div>
  5. <input :value="content"/>
  6. <div>{{content}}</div>
  7. </div>
  8.  
  9. <script>
  10. new Vue({
  11. el: "#root",
  12. data: {
  13. title: "this is hello world",
  14. content: "this is content"
  15. }
  16. })
  17. </script>
  18. </body>

但是数据并没有发生同步变化,因为如果数据发生改变,下面展示的内容,也会根据输入的内容发生相应的变化。所以这里的改变,仅仅是改变了input标签中的value值,并没有使data中的content发生变化。

 

所以我们使用 v-model 这个模板指令,进行数据双向绑定。

  1. <script src="./vue.js"></script>
  2. <body>
  3. <div id="root">
  4. <div :title="title">hello world</div>
  5. <input v-model="content"/>
  6. <div>{{content}}</div>
  7. </div>
  8.  
  9. <script>
  10. new Vue({
  11. el: "#root",
  12. data: {
  13. title: "this is hello world",
  14. content: "this is content"
  15. }
  16. })
  17. </script>
  18. </body>

JSbin 预览
input标签中,使用v-model就可以完成双向数据的绑定,效果如下图。

计算属性和侦听器

计算属性 computed

在这个案例中,使用上面已经提到过的v-model进行双向数据绑定之后,在input标签中输入相应的数据,会把firstNamelastName拼装好了之后在div中一起展现出来。

  1. <script src="./vue.js"></script>
  2. <body>
  3. <div id="root">
  4. 姓:<input v-model="firstName"/>
  5. 名:<input v-model="lastName"/>
  6. <div>{{firstName}}{{lastName}}</div>
  7. </div>
  8.  
  9. <script>
  10. new Vue({
  11. el: "#root",
  12. data: {
  13. firstName: '',
  14. lastName: ''
  15. }
  16. })
  17. </script>
  18. </body>

JSbin 预览

我们通过改造,将firstNamelastName糅合成一个变量,取名为fullName。即fullName是通过firstNamelastName计算而成的一个新的变量。遇到这种情况,通过计算属性解决。

在Vue的实例配置对象里面,配置computed对象属性,在里面定义一个fullName函数,返回值是 this.firstName + ' ' + this.lastName

  1. <script src="./vue.js"></script>
  2. <body>
  3. <div id="root">
  4. 姓:<input v-model="firstName"/>
  5. 名:<input v-model="lastName"/>
  6. <div>{{fullName}}</div>
  7. </div>
  8.  
  9. <script>
  10. new Vue({
  11. el: "#root",
  12. data: {
  13. firstName: '',
  14. lastName: ''
  15. },
  16. computed: { //定义一个computed对象,在里面定义fullName函数
  17. fullName: function(){
  18. return this.firstName + ' ' + this.lastName
  19. }
  20. }
  21. })
  22. </script>
  23. </body>

JSbin 预览

computed 值的是一个属性,通过其他属性计算而来。优点是 computed 中参与计算的值如果都没有改变,会使用上一次计算得到的缓存结果,不会重新计算。只有参数计算的值发生变化的时候,才会重新计算。

侦听器 watch

监听某一个数据的变化,一旦数据发生变化,就可以在侦听器中实现某个业务逻辑。

  1. <script src="./vue.js"></script>
  2. <body>
  3. <div id="root">
  4. 姓:<input v-model="firstName"/>
  5. 名:<input v-model="lastName"/>
  6. <div>{{fullName}}</div>
  7. <div>{{count}}</div>
  8. </div>
  9.  
  10. <script>
  11. new Vue({
  12. el: "#root",
  13. data: {
  14. firstName: '',
  15. lastName: '',
  16. count: 0 //定义变量 count,默认值为 0
  17. },
  18. computed: {
  19. fullName: function(){
  20. return this.firstName + ' ' + this.lastName
  21. }
  22. },
  23. watch: { //定义侦听器
  24. firstName: function(){ //监听 firstName 的变化
  25. this.count ++
  26. },
  27. lastName: function(){ //监听 lastName 的变化
  28. this.count ++
  29. }
  30. }
  31. })
  32. </script>
  33. </body>

JSbin 预览

通过watch的形式进行侦听器的定义。
当对fristNamelastName做任意的变更,count 数值 +1

当然我们也可以只对 fullName 做监听,即针对计算属性做监听。

  1. <script src="./vue.js"></script>
  2. <body>
  3. <div id="root">
  4. 姓:<input v-model="firstName"/>
  5. 名:<input v-model="lastName"/>
  6. <div>{{fullName}}</div>
  7. <div>{{count}}</div>
  8. </div>
  9.  
  10. <script>
  11. new Vue({
  12. el: "#root",
  13. data: {
  14. firstName: '',
  15. lastName: '',
  16. count: 0
  17. },
  18. computed: {
  19. fullName: function(){
  20. return this.firstName + ' ' + this.lastName
  21. }
  22. },
  23. watch: {
  24. fullName: function(){
  25. this.count
  26. }
  27. }
  28. })
  29. </script>
  30. </body>

v-if v-show 与 v-for

v-if

  1. <script src="./vue.js"></script>
  2. <body>
  3. <div id="root">
  4. <div v-if="show">hello world</div>
  5. <button @click="handleClick">toggle</button>
  6. </div>
  7.  
  8. <script>
  9. new Vue({
  10. el: "#root",
  11. data: {
  12. show: true
  13. },
  14. methods: {
  15. handleClick: function(){
  16. this.show = !this.show
  17. }
  18. }
  19. })
  20. </script>
  21. </body>

在模板中的 data 添加 show 属性,值为 true,并在 div 标签中添加 v-if="show" 的指令,并对 button 元素绑定 @click 事件,在模板中的 methods 添加对应事件的函数。
达到点击 button 切换 hello world 的显示和隐藏效果。
JSbin 预览

即在使用 v-if 指令时,当它对应的数据向的指令对应的是 false 时,会将这个标签,直接从 DOM 中移除。

v-show

使用 v-show,看上去效果和 v-if 是一样的效果,但点开控制台观察 DOM 结构的变化,v-show 并不会使 DOM节点 发生删除和添加,它的隐藏是在这个节点上添加了一个display: none;的 CSS 属性。

即 v-show 不会频繁的 销毁 和 创建DOM。在有频繁的显示和隐藏需求时,使用 v-show对于性能来讲,应该是更好的选择。
如果只有一次显示、隐藏的需求,对于使用 v-if 可能是更好的选择。

v-for

当有一个数据需要做循环展示时,帮助我们进行操作。

  1. <script src="./vue.js"></script>
  2. <body>
  3. <div id="root">
  4. <div v-if="show">hello world</div>
  5. <button @click="handleClick">toggle</button>
  6. <ul>
  7. <!-- 在li标签中 添加v-for指令 使用:key属性提升渲染性能 -->
  8. <li v-for="item of list" :key="item">{{item}}</li>
  9. </ul>
  10. </div>
  11.  
  12. <script>
  13. new Vue({
  14. el: "#root",
  15. data: {
  16. show: true,
  17. list: [1,2,3] //添加list数组
  18. },
  19. methods: {
  20. handleClick: function(){
  21. this.show = !this.show
  22. }
  23. }
  24. })
  25. </script>
  26. </body>

JSbin 预览

记住使用 :key 属性提升渲染性能,每次的:key 属性都不相同,所以可以使用 "item"作为他的属性值。
但如果数组中本身有重复的值。这个时候:key 属性值就不能使用 "item" 作为他的属性值了。这个时候,我们将 v-for 设置成 v-for="(item,index) of list" 然后让:key 属性值为 index,保证它的唯一性。
但如果平凡对列表进行变更的时候,index 的使用也是有问题的。

  1. <body>
  2. <div id="root">
  3. <div v-if="show">hello world</div>
  4. <button @click="handleClick">toggle</button>
  5. <ul>
  6. <!-- 在li标签中 添加v-for指令 使用:key属性提升渲染性能 并使用index值-->
  7. <li v-for="(item,index) of list" :key="index">{{item}}</li>
  8. </ul>
  9. </div>
  10.  
  11. <script>
  12. new Vue({
  13. el: "#root",
  14. data: {
  15. show: true,
  16. list: [1,2,3] //添加list数组
  17. },
  18. methods: {
  19. handleClick: function(){
  20. this.show = !this.show
  21. }
  22. }
  23. })
  24. </script>
  25. </body>

Vuejs 基础与语法的更多相关文章

  1. node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法

    1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...

  2. OC基础 点语法的使用

    OC基础 点语法的使用 1.创建一个Student类继承于NSObject,Student.h文件 #import <Foundation/Foundation.h> @interface ...

  3. 二、JAVA基础、语法

    第二节:JAVA基础.语法 1.修饰符.变量:    Java中主要有如下几种类型的变量    局部变量                                                 ...

  4. 六. Python基础(6)--语法

    六. Python基础(6)--语法 1 ● Python3中, Unicode转字节的方法 print(bytes("李泉", encoding = 'utf-8')) prin ...

  5. 五. Python基础(5)--语法

    五. Python基础(5)--语法 1 ● break结束的是它所在的循环体, continue是让它所在的循环体继续循环 # 打印: 1 10 2 10 3 10 4 10 5 10 6 10 7 ...

  6. 四. Python基础(4)--语法

    四. Python基础(4)--语法 1 ● 比较几种实现循环的代码 i = 1 sum = 0 while i <= 10: # 循环10-1+1=10次     sum += i     i ...

  7. 三. Python基础(3)--语法

    三. Python基础(3)--语法 1. 字符串格式化的知识补充 tpl = "我是%s,年龄%d,学习进度100%" %('Arroz',18) print(tpl) # 会提 ...

  8. 二. Python基础(2)--语法

    二. Python基础(2)--语法 1.实现一个简单的登录系统 '''# 形式1 n = 1 while n < 4:     name = input("请输入姓名\n" ...

  9. 一. Python基础(1)--语法

    一. Python基础(1)--语法 1. 应用程序 1.1 什么是计算机(Computer)? 组成 ①运算器 arithmetic unit; ※ Arithmetic unit and cont ...

随机推荐

  1. Entity FreamWork 无法创建“System.Object”类型的常量值。此上下文仅支持基元类型或枚举类型错误解决

    Entity FreamWork 无法创建“System.Object”类型的常量值.此上下文仅支持基元类型或枚举类型错误解决: 最近在开发中把我原来抄的架构里面的主键由固定的Guid改成了可以泛型指 ...

  2. MyBatis之properties配置

    这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递.例如: <properties resource=" ...

  3. LeetCode 中级 -二叉树的层次遍历(102)

    题目描述: 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 ...

  4. 集合栈计算机(The SetStack Computer, ACM/ICPC NWERC 2006,Uva12096)

    集合栈计算机(The SetStack Computer, ACM/ICPC NWERC 2006,Uva12096) 题目描述 有一个专门为了集合运算而设计的"集合栈"计算机.该 ...

  5. Wireshark工具抓包的数据包分析

    Wireshark(前称Ethereal)是一个网络封包分析软件.网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料. Wireshark使用WinPCAP作为接口,直接与网卡 ...

  6. 在tornado中使用异步mysql操作

    在使用tornado框架进行开发的过程中,发现tornado的mysql数据库操作并不是一步的,造成了所有用户行为的堵塞.tornado本身是一个异步的框架,要求所有的操作都应该是异步的,但是数据库这 ...

  7. 一、PHP基础-安装PHP集成环境

    目录 PHP运行集成环境下载 phpStudy集成环境安装 XAMPP集成环境安装 WampServer环境安装 作者:吴耀田  个人博客:http://www.cnblogs.com/isaacwy ...

  8. 大数据学习--day06(Eclipse、数组)

    Eclipse.数组 Eclipse 的基本设置   调节控制条字体大小. Window -> Preferences -> General -> Appearance -> ...

  9. Java实例 Part2:Java语言基础

    Part2:Java语言基础 ** Example01:从控制台接收输入字符 ** 运行结果: 实现代码: import java.util.Scanner; public class Example ...

  10. DXP常用的设置及快捷键

    原文地址:http://www.cnblogs.com/NickQ/p/8799240.html 测试环境:Altium Designer Summer 16 一.快捷键 1.原理图和PCB通用快捷键 ...