Vue 系列之 基础入门

时间:2020-12-21 13:44:19

背景叙述

渐进式 JavaScript 框架

  • 易用:已经会了 HTML、CSS、JavaScript?即刻阅读指南开始构建应用!
  • 灵活:不断繁荣的生态系统,可以在一个库和一套完整框架之间自如伸缩。
  • 高效:20kB min+gzip 运行大小超快虚拟 DOM 最省心的优化

上述是 Vue.js 官网网站给出的该前端框架的特点,而对于我这个一开始就是做 WPF 开发的 C# 程序员来说,则看上了它的 MVVM,所以,打算认真学习一下。由于 Vue 是一个前端框架,所以在开发的过程中必然会涉及到 Html、js、css。

安装

用 script 引用

选择合适版本的 vue.js 将其下载至本地,在相应页面中的 head 元素中添加下述语句:

<script src="./vue.js"></script>

使用 CDN 方式引用

在页面中的 head 标签中添加下述语句:

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

NPM 方式(构建大型项目时推荐:CLI)

要想使用 NMP 方式,首先需要确保本机已经安装了 NodeJS (下载地址)工具,可通过执行 npm -v 查看是否以安装,安装好之后可参考下述命令进行 vue 的安装

# 安装 cnpm 并 修改 npm 的镜像服务器
npm install -g cnpm --registry=https://registry.npm.taobao.org # 全局安装 vue
cnpm install -g vue-cli # 或者全局安装 Vue CLI 3
npm install -g @vue/cli # 如果无法正常安装请尝试清理缓存
npm cache clean --force # 验证是否安装成功
vue -V # 创建 vue 项目
vue init webpack project-name # 或者通过 Vue CLI 3 创建项目
vue create project-name # install dependencies
npm install # serve with hot reload at localhost:8080
npm run dev # build for production with minification
npm run build # build for production and view the bundle analyzer report
npm run build --report # run unit tests
npm run unit # run e2e tests
npm run e2e # run all tests
npm test

后续补充,暂时先知道这么用就行。

一个简单的例子

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<script src="./vue.js"></script>
<title>Vue</title>
</head> <body>
<h1 id="app">{{msg}}</h1>
<script>
new Vue({
el: "#app",
data: {
msg: "Hello world"
}
})
</script>
</body> </html>

挂载点、模板、实例

挂载点

是指 vue 实例中 el 属性对应的 Dom 节点, vue 只会处理挂载点下的 Dom 元素。类似 WPF 中 View 层 Element source。

模板

在挂载点内部的内容统一称之为模板。有两种使用方式

方式 1

<body>
<div id="app">
<h1>你好: {{msg}}</h1>
</div>
<script>
new Vue({
el: "#app",
data: {
msg: "Hello world"
}
})
</script>
</body>

方式 2

<body>
<div id="app">
</div>
<script>
new Vue({
el: "#app",
template:"<h1>你好: {{msg}}</h1>",
data: {
msg: "Hello world"
}
})
</script>
</body>

方式 2 中 template 需要包含 Dom 元素,否则无法显示。

实例

对应一个 Vue 实例

三者关系

实例 用于创建数据上下文,模板 定义了数据上下文显示的样式,挂载点 指定了数据上下文显示的位置。

数据、事件、方法

数据

位于 vue 实例中的 data 节点。有下述几种方式来表示:

方式 1

<body>
<div id="app">
<h1>{{number}}</h1>
<h1 v-text="number"></h1>
<h1 v-html="number"></h1>
</div>
<script>
new Vue({
el: "#app",
data: {
number: 123
}
})
</script>
</body>

方式 2

<body>
<div id="app">
<h1>{{string}}</h1>
<h1 v-text="number"></h1>
<h1 v-html="content"></h1>
</div>
<script>
new Vue({
el: "#app",
data: {
string: "hello world",
number: 123,
content: "<h1>Hello</h1>"
}
})
</script>
</body>

v-text 会将内容进行转义,v-html 会将内容进行转义;动态渲染的任意 HTML 可能会非常危险,因为它很容易导致 XSS 攻击。请只对可信内容使用 HTML 插值 v-html,绝不要对用户提供的内容使用插值。

事件与方法绑定

<body>
<div id="app">
<div v-on:click="handleClick">{{content}}</div>
</div>
<script>
new Vue({
el: "#app",
data: {
content: "Hello"
},
methods: {
handleClick: function () {
this.content = "world"
}
}
})
</script>
</body>

简写方式

<body>
<div id="app">
<div @click="handleClick">{{content}}</div>
</div>
<script>
new Vue({
el: "#app",
data: {
content: "Hello"
},
methods: {
handleClick: function () {
this.content = "world"
}
}
})
</script>
</body>

属性绑定和双向数据绑定

单向绑定:

<body>
<div id="root">
<div v-bind:title="title">hello world</div>
<!-- 简写方式 -->
<div :title="title">hello world</div>
</div>
<script>
new Vue({
el: "#root",
data: {
title: "this is hello world"
}
})
</script>
</body>

双向绑定

<body>
<div id="root">
<input v-model="content">
<div>{{content}}</div>
</div>
<script>
new Vue({
el: "#root",
data: {
content: "this a content"
}
})
</script>
</body>

通过使用 v-once 指令,能执行一次性地插值,当数据改变时,插值处的内容不会更新;

计算属性和侦听器

计算属性:computed

<body>
<div id="root">
姓:<input type="text" v-model="firstName"> 名:
<input type="text" v-model="lastName">
<div>{{fullName}}</div>
</div> <script>
new Vue({
el: '#root',
data: {
firstName: "",
lastName: ""
},
computed: {
fullName: function () {
return this.firstName + ' ' + this.lastName
}
}
})
</script>
</body>

计算属性是基于它们的依赖进行缓存的。只有依赖对象属性值发生变化时才会重写计算,否则使用上次缓存的数据进行计算。类似 C# 中对对象属性操作;

侦听器:watch

<body>
<div id="root">
姓:<input type="text" v-model="firstName"> 名:
<input type="text" v-model="lastName">
<div>{{fullName}}</div>
<div v-text="count"></div>
</div> <script>
new Vue({
el: '#root',
data: {
firstName: "",
lastName: "",
count: 0
},
computed: {
//计算属性
fullName: function () {
return this.firstName + ' ' + this.lastName
}
},
watch: {
//侦听属性
firstName: function () {
this.count++
},
//侦听属性
lastName: function () {
this.count++
},
//侦听属性
fullName:function(){
this.count++
}
}
})
</script>
</body>

计算属性默认只有 getter ,不过在需要时你也可以提供一个 setter :

// ...
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]
}
}
}
// ...

对属性变化事件进行监听,支持对监听属性和数据属性进行监听。类似 C# 中对对象静态属性操作;除了 watch 选项之外,您还可以使用命令式的 vm.$watch API。

指令相关

指令 (Directives) 是带有 v- 前缀的特殊特性。指令特性的值预期是单个 JavaScript 表达式 (v-for 是例外情况,稍后我们再讨论)。指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM。

v-if 与 v-show

<body>
<div id="root">
<div v-if="show">hello world</div>
<div v-show="show">hello world</div>
<button @click="handleClick">toggle</button>
</div>
<script>
new Vue({
el: "#root",
data: {
show: true
},
methods: {
handleClick: function () {
this.show = !this.show
}
}
})
</script>
</body>

v-if 是直接对 Dom 对象进行操作,当该指令为 false 时,会直接删除该 Dom 对象,v-show 则是通过 style 样式来对 Dom 对象进行设置;

v-for

<body>
<div id="root">
<ul>
<li v-for="item in items" :key="item">{{item}}</li>
</ul>
<ul>
<li v-for="(item, index) in items" :key="index">{{item}}</li>
</ul>
</div>
<script>
new Vue({
el: "#root",
data: {
items: [1, 2, 3]
}
})
</script>
</body>

使用 key 能提高页面渲染,需要保证每次遍历时 key 值不能出现重复;

参数与事件的绑定

v-bind 指令可以用于响应式地更新 HTML 特性:

# 参数绑定
<a v-bind:href="url">...</a>
# 事件绑定
<a v-on:click="doSomething">...</a>
  • href 是参数,告知 v-bind 指令将该元素的 href 特性与表达式 url 的值绑定;
  • doSomething 是事件,与 对应的 vue 实例 相关函数进行绑定

修饰符

修饰符 (Modifiers) 是以半角句号 . 指明的特殊后缀,用于指出一个指令应该以特殊方式绑定。例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault():

<form v-on:submit.prevent="onSubmit">...</form>

缩写

  • v-bind
<!-- 完整语法 -->
<a v-bind:href="url">...</a> <!-- 缩写 -->
<a :href="url">...</a>
  • v-on
<!-- 完整语法 -->
<a v-on:click="doSomething">...</a> <!-- 缩写 -->
<a @click="doSomething">...</a>

相关参考