当前位置:首页 » 《随便一记》 » 正文

Vue快速入门(上)_越努力越幸运的博客

12 人参与  2022年03月20日 14:33  分类 : 《随便一记》  评论

点击全文阅读


文章目录

  • Vue快速入门(上)(应急用)
    • 一、下载和导入Vue
    • 二、第一个Vue程序
    • 三、条件与循环
    • 四、处理用户输入(事件监听器)
    • 五、Vue实例
      • 5.1 $watch(当某个变量被修改后调用)
      • 5.2 生命周期
    • 六、模板语法
      • 6.1 文本
      • 6.2 原始HTML
      • 6.3 Attribute
      • 6.4 使用JavaScript表达式
      • 6.5 指令
      • 6.6 缩写
    • 七、计算属性和侦听器

Vue快速入门(上)(应急用)

一、下载和导入Vue

要想用vue,首先,我们肯定要引用vue的“依赖”。这里提供两种方法:

方法一、自己去官网下载vue.js文件
点击这里下载vue.js文件 (由于这里发送的是get请求,无法直接下载,所以你得把网站下的内容都复制出来然后放到一个空白的vue.js文件中再进行使用。)

方法二、使用在线的vue.js

<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>

二、第一个Vue程序

学程序,首先当时是hello,world。直接贴源码:(源码的解析在源码下边)

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Hello,World</title>
    <!--导入Vue-->
    <script type="text/javascript" src="../js/vue.js" charset="UTF-8"></script>
</head>
<body>
    <div id="app">
        {{message}}
    </div>
    <script type="text/javascript">
        let app = new Vue({
            el:'#app',
            data:{
                message: "Hello,world"
            }
        });
    </script>
</body>
</html>

解析:

<script type="text/javascript" src="../js/vue.js" charset="UTF-8"></script>

这一句是引入我们的Vue,不用讲应该都能知道。

    <div id="app">
        {{message}}
    </div>

这一段是定义我们的div的id为app,然后使用两个花括号{{}}引用我们定义的data的属性。

    <script type="text/javascript">
        let app = new Vue({
            el:'#app',
            data:{
                message: "Hello,world"
            }
        });
    </script>

这一段是最关键的,用Ajax来说,new Vue这一步其实就相当于$,然后el其实就是我们的element,#表示获取id值,直接写字符串是获取标签,.类名表示获取class。然后data就是他里面被赋值的变量。我们可以通过{{变量名}}进行获取。

注意:vue的使用最好是放在body的最下边。否则可能会因为获取不到 id ,导致message没有正常渲染。

我们已经成功创建了第一个 Vue 应用!看起来这跟渲染一个字符串模板非常类似,但是 Vue 在背后做了大量工作。现在数据和 DOM 已经被建立了关联,所有东西都是响应式的。我们要怎么确认呢?打开你的浏览器的 JavaScript 控制台 (就在这个页面打开),并修改 app.message 的值,你将看到上例相应地更新。
在这里插入图片描述
注意我们不再和 HTML 直接交互了。一个 Vue 应用会将其挂载到一个 DOM 元素上 (对于这个例子是 #app) 然后对其进行完全控制。那个 HTML 是我们的入口,但其余都会发生在新创建的 Vue 实例内部。

三、条件与循环

v-if 属性表示条件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>条件与循环</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <div id="demo">
        <p v-if="seen">现在你能看到我了!</p>
    </div>
    <script type="text/javascript">
        let demo = new Vue({
            el:"#demo",
            data:{
                seen: true
            }
        });
    </script>
</body>
</html>

显示:
在这里插入图片描述
我们可以在console中把他的seen变为false,将它隐藏。
在这里插入图片描述
循环语句也很简单,使用v-for标签遍历,指明遍历哪个变量,每个被遍历到的属性的变量即可。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>循环语句</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <ul id="List">
        <li v-for="item in studentList">
            学号:{{item.id}},
            姓名:{{item.name}},
            年龄:{{item.age}}
        </li>
    </ul>

    <script type="text/javascript">
    let demo = new Vue({
        el:"#List",
        data:{
            studentList:[
                {id:'1001',name:'张三',age:18},
                {id:'1002',name:'张三',age:18},
                {id:'1003',name:'张三',age:18},
                {id:'1004',name:'张三',age:18},
                {id:'1005',name:'张三',age:18},
            ]
        }
    });
</script>
</body>
</html>

结果:
在这里插入图片描述

四、处理用户输入(事件监听器)

为了让用户和你的应用进行交互,我们可以用 v-on 指令添加一个事件监听器 ,通过它调用在 Vue 实例中定义的方法:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>监听器</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <div id="onDemo">
        <p>{{message}}</p>
        <button v-on:click="updateMsg">点击可以修改段落内容</button>
    </div>

    <script type="text/javascript">
        let demo = new Vue({
            el:"#onDemo",
            data:{
                count:0,
                message:'我是人见人爱的段落哟'
            },
            methods:{
                updateMsg: function () {
                    if(++this.count %2 == 0){
                        this.message = '不管怎么样,我都是人见人爱的段落。'
                    }else {
                        this.message = '跟你说了我永远是人见人爱的段落了吧。'
                    }
                }
            }
        })
    </script>
</body>
</html>

显示:
在这里插入图片描述
奇数次点击按钮显示:
在这里插入图片描述
偶数次点击按钮显示:
在这里插入图片描述
Vue 还提供了 v-model 指令,它能轻松实现表单输入和应用状态之间的双向绑定。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件绑定</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <div id="demo">
        <p>{{message}}</p>
        <input v-model="message">
    </div>
    <script type="text/javascript">
        let demo = new Vue({
            el:"#demo",
            data:{
                message:'Hello'
            }
        })
    </script>
</body>
</html>

运行:(p能读取input的内容并实时显示)
在这里插入图片描述

五、Vue实例

5.1 $watch(当某个变量被修改后调用)

通过调用new Vue()返回的对象的$watch方法,在每次某个变量发生改变的时候

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>监听器</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <div id="onDemo">
        <p>{{message}}</p>
        <button v-on:click="updateMsg">点击可以修改段落内容</button>
    </div>

    <script type="text/javascript">
        let demo = new Vue({
            el:"#onDemo",
            data:{
                count:0,
                message:'我是人见人爱的段落哟'
            },
            methods:{
                updateMsg: function () {
                    if(++this.count %2 == 0){
                        this.message = '不管怎么样,我都是人见人爱的段落。'
                    }else {
                        this.message = '跟你说了我永远是人见人爱的段落了吧。'
                    }
                }
            }
        });
        //监听demo的count变量
        demo.$watch('count', function (newVal, oldVal) {
            console.log("The oldVal of count is "+oldVal);
            console.log("The newVal of count is "+newVal);
        });
        //监听demo的message变量
        demo.$watch('message',function (newVal, oldVal) {
            console.log("The oldVal of message is "+oldVal);
            console.log("The newVal of message is "+newVal);
        });
    </script>
</body>
</html>

结果:
在这里插入图片描述
点击两次按钮后:
在这里插入图片描述
在这里插入图片描述

5.2 生命周期

直接看图就行了,没学过的如果看不懂的话也不要紧,等学差不多了再回来看一次就行了。
这里大概说一下:这里目前最主要的就是知道这些个方法(我们也叫钩子)在什么时候会被调用,比如

钩子调用时间
beforeCreate在Vue对象被创建前
created在Vue对象被创建后
beforeMount在el渲染成html之前
mounted在el渲染成html之后
beforeUpdate数据发生改变之前
updateed数据发生改变之后
beforeDestroy拆除watcher、子组件、事件监听器前
destroyed拆除watcher、子组件、事件监听器后

在这里插入图片描述
用法也比较简单,这里给出一个实例:

let demo = new Vue({
    el:"#onDemo",
    data:{
        count:0,
        message:'我是人见人爱的段落哟'
    },
    created: function(){
        console.log("The count is "+this.count);
        console.log("The message is "+this.message);
    },
    methods:{
        updateMsg: function () {
            if(++this.count %2 == 0){
                this.message = '不管怎么样,我都是人见人爱的段落。'
            }else {
                this.message = '跟你说了我永远是人见人爱的段落了吧。'
            }
        }
    },
});

六、模板语法

6.1 文本

数据绑定最常见的形式就是使用“Mustache”语法 (双大括号) 的文本插值:

<span id=“demo”> {{ msg }}\ </span>

Mustache 标签将会被替代为对应数据对象上 msg 属性的值。无论何时,绑定的数据对象上 msg属性发生了改变,插值处的内容都会更新。

如果我们不希望这个值发生改变的话,那么我们可以给对应的标签加上v-once属性。(注意:这会影响到该节点上的其它数据绑定

<span id=“demo” v-once>这个将不会改变: {{ msg }}</span>

6.2 原始HTML

双大括号会将数据解释为普通文本,而非 HTML 代码。为了输出真正的 HTML,你需要使用 v-html 指令:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>原始HTML</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <p id="demo">Using mustaches: {{ rawHtml }}</p>
<!--    <p id="demo">Using v-html directive: <span v-html="rawHtml"></span></p>-->
    <script>
        demo = new Vue({
            el:"#demo",
            data:{
                rawHtml: '<span style="color:red">This should be red.</span>'
            }
        })
    </script>
</body>
</html>

结果:
在这里插入图片描述
如果这么写:

<!--    <p id="demo">Using mustaches: {{ rawHtml }}</p>-->
    <p id="demo">Using v-html directive: <span v-html="rawHtml"></span></p>

结果:
在这里插入图片描述
注意:在我们自己的站点上动态渲染的任意 HTML 可能会非常危险,因为它很容易导致 XSS 攻击。请只对可信内容使用 HTML 插值,绝不要对用户提供的内容使用插值。

6.3 Attribute

Mustache 语法不能作用在 HTML attribute 上,遇到这种情况应该使用 v-bind 指令:

<div v-bind:id="dynamicId"></div>

对于布尔 attribute (它们只要存在就意味着值为 true),v-bind 工作起来略有不同,在这个例子中:

<button v-bind:disabled="isButtonDisabled">Button</button>

如果 isButtonDisabled 的值是 null、undefined 或 false,则 disabled 参数甚至不会被包含在渲染出来的 <button> 元素中。

6.4 使用JavaScript表达式

迄今为止,在我们的模板中,我们一直都只绑定简单的属性值。但实际上,对于所有的数据绑定,Vue.js 都提供了完全的 JavaScript 表达式支持。比如,我们可以这么写:

{{ number + 1 }}

{{ ok ? 'YES' : 'NO' }}

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

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

这些表达式会在所属 Vue 实例的数据作用域下作为 JavaScript 被解析。有个限制就是,每个绑定都只能包含单个表达式,所以下面的例子都不会生效。

<!-- 这是语句,不是表达式 -->
{{ let a = 1 }}

<!-- 流控制也不会生效,请使用三元表达式 -->
{{ if (ok) { return message } }}

6.5 指令

前面我们其实讲过一点点,但是我都没叫他们指令,而是用更通俗的叫法,我叫他们属性,那指令是啥东西呢?其实就是以v-开头的属性。(例如,前面我们已经接触了v-if,v-for,v-bind,v-html,v-once,v-on,v-model)

一些指令甚至可以接收一个参数,在指令名称之后以冒号表示。例如,v-bind 指令可以用于响应式地更新 HTML属性:

<a v-bind:href="url">...</a>

用法:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>跳转百度</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <a id="addr" v-bind:href="url">跳转到百度</a>
    <script>
        new Vue({
            el:"#addr",
            data:{
                url: "http://www.baidu.com"
            }
        })
    </script>
</body>
</html>

结果:
在这里插入图片描述
点击后跳转到百度页面。
在这里插入图片描述
还有一个v-on用于绑定标签的事件监听器。(可以看一下前面的例子回顾一下:当点击button按钮的时候,就调用他的updateMsg方法。)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>监听器</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <div id="onDemo">
        <p>{{message}}</p>
        <button v-on:click="updateMsg">点击可以修改段落内容</button>
    </div>

    <script type="text/javascript">
        let demo = new Vue({
            el:"#onDemo",
            data:{
                count:0,
                message:'我是人见人爱的段落哟'
            },
            created: function(){
                console.log("The count is "+this.count);
                console.log("The message is "+this.message);
            },
            methods:{
                updateMsg: function () {
                    if(++this.count %2 == 0){
                        this.message = '不管怎么样,我都是人见人爱的段落。'
                    }else {
                        this.message = '跟你说了我永远是人见人爱的段落了吧。'
                    }
                }
            },
        });
        //监听demo的count变量
        demo.$watch('count', function (newVal, oldVal) {
            console.log("The oldVal of count is "+oldVal);
            console.log("The newVal of count is "+newVal);
        });
        //监听demo的message变量
        demo.$watch('message',function (newVal, oldVal) {
            console.log("The oldVal of message is "+oldVal);
            console.log("The newVal of message is "+newVal);
        });
    </script>
</body>
</html>

从Vue的2.6.0版本开始,我们还可以用方括号括起来的 JavaScript 表达式作为一个指令的参数:

<a v-bind:[attributeName]="url"> ... </a>

这里,如果我们的data中的attributeName值为"href",那么这个绑定将等价于 v-bind:href。然后url也是data中的属性值。

当然了,这种动态的参数表达式也是有约束的,某些字符,如空格和引号,放在 HTML 属性里是无效的。例如:<a v-bind:['foo' + bar]="value"> ... </a>,这么写的话会触发一个编译警告,解决的方法自然是使用没有空格或引号的表达式,或用计算属性替代这种复杂表达式。
注意:在 DOM 中使用模板时 (直接在一个 HTML 文件里撰写模板),还需要避免使用大写字符来命名键名,因为浏览器会把 attribute 名全部强制转为小写:

比如这个<a v-bind:[someAttr]="value"> ... </a>,就会等价于<a v-bind:[someattr]="value"> ... </a>

6.6 缩写

v- 前缀作为一种视觉提示,用来识别模板中 Vue 特定的 attribute。当你在使用 Vue.js 为现有标签添加动态行为 (dynamic behavior) 时,v- 前缀很有帮助,然而,对于一些频繁用到的指令来说,就会感到使用繁琐。因此,对于 v-bind 和 v-on 这两个最常用的指令,Vue 还提供了特定缩写:

v-bind的如下:

<!-- 完整语法 -->
<a v-bind:href="url">...</a>

<!-- 缩写 -->
<a :href="url">...</a>

<!-- 动态参数的缩写 (2.6.0+) -->
<a :[key]="url"> ... </a>

v-on的缩写如下:

<!-- 完整语法 -->
<a v-on:click="doSomething">...</a>

<!-- 缩写 -->
<a @click="doSomething">...</a>

<!-- 动态参数的缩写 (2.6.0+) -->
<a @[event]="doSomething"> ... </a>

七、计算属性和侦听器

模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。例如:

<div id="example">
  {{ message.split('').reverse().join('') }}
</div>

在这个地方,模板不再是简单的声明式逻辑。你必须看一段时间才能意识到,这里是想要显示变量 message 的翻转字符串。当你想要在模板中的多处包含此翻转字符串时,就会更加难以处理。

所以,对于任何复杂逻辑,我们都应当使用计算属性,将他们抽取出来变成一个“方法”。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>计算属性</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <div id="example">
        <p>Original message: "{{ message }}"</p>
        <p>Computed reversed message: "{{ reversedMessage }}"</p>
        <p>随机数:{{randomMessage}}</p>
    </div>

    <script type="text/javascript">
        var vm = new Vue({
            el: '#example',
            data: {
                message: 'Hello'
            },
            //computed下方的就是一系列的计算属性的方法体啦!
            computed: {
                // 计算属性的 getter
                reversedMessage: function () {
                    // `this` 指向 vm 实例
                    return this.message.split('').reverse().join('')
                },
                randomMessage: function () {
                    return Math.floor(Math.random()*100);
                }
            }
        })
    </script>
</body>
</html>

结果:
在这里插入图片描述
这里,有些人可能会说,那我把他写成一个方法,再调用不是一样吗?我们可以像下面这么写,这么写也是对的。那区别在哪里呢?答案是计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。这就意味着只要 message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。而如果我们写在methods下,并进行调用的话,他每次都会重新求值再返回。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>计算属性</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <div id="example">
        <p>Original message: "{{ message }}"</p>
        <p>Computed reversed message: "{{ reversedMessage }}"</p>
        <p>Computed reversed message: "{{ reversedMessageFun() }}"</p>
        <p>随机数:{{randomMessage}}</p>
    </div>

    <script type="text/javascript">
        var vm = new Vue({
            el: '#example',
            data: {
                message: 'Hello'
            },
            //computed下方的就是一系列的计算属性的方法体啦!
            computed: {
                // 计算属性的 getter
                reversedMessage: function () {
                    // `this` 指向 vm 实例
                    return this.message.split('').reverse().join('')
                },
                randomMessage: function () {
                    return Math.floor(Math.random()*100);
                }
            },
            methods:{
                reversedMessageFun : function(){
                    return this.message.split('').reverse().join('')
                }
            }
        })
    </script>
</body>
</html>

另外,当我们有一些数据需要随着其它数据变动而变动时,我们其实很容易滥用 watch——特别是如果你之前使用过 AngularJS。然而,通常更好的做法是使用计算属性而不是命令式的 watch 回调。
让我们来看看watch的写法:

<div id="demo">{{ fullName }}</div>
<script type="text/javascript">
	let vm = new Vue({
	  el: '#demo',
	  data: {
	    firstName: 'Foo',
	    lastName: 'Bar',
	    fullName: 'Foo Bar'
	  },
	  watch: {
	    firstName: function (val) {
	      this.fullName = val + ' ' + this.lastName
	    },
	    lastName: function (val) {
	      this.fullName = this.firstName + ' ' + val
	    }
	  }
	})
</script>

但是如果我们用计算属性的话,就是:

<div id="demo">{{ fullName }}</div>
<script type="text/javascript">
	let vm = new Vue({
	  el: '#demo',
	  data: {
	    firstName: 'Foo',
	    lastName: 'Bar'
	  },
	  computed: {
	    fullName: function () {
	      return this.firstName + ' ' + this.lastName
	    }
	  }
	})
</script>

上面我们一直在用计算属性的getter,但是偶尔我们可能也会需要用他的set方法

// ...
computed: {
  fullName: {
    // getter
    get: function () {
      return this.firstName + ' ' + this.lastName
    },
    // setter
    set: function (newValue) {
      var names = newValue.split(' ')
      this.firstName = names[0]
      this.lastName = names[names.length - 1]
    }
  }
}
// ...

现在再运行 vm.fullName = ‘John Doe’ 时,setter 会被调用,vm.firstName 和 vm.lastName 也会相应地被更新。


点击全文阅读


本文链接:http://zhangshiyu.com/post/36402.html

属性  表达式  指令  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1