Vue 系列之 基础入门
背景叙述
渐进式 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>
相关参考
Vue 系列之 基础入门的更多相关文章
- 「译」JUnit 5 系列:基础入门
原文地址:http://blog.codefx.org/libraries/junit-5-basics/ 原文日期:25, Feb, 2016 译文首发:Linesh 的博客:JUnit 5 系列: ...
- Docker 系列之 基础入门
安装 Docker Windows 10 专业版以上版本 Docker for Windows Installer 在安装前,需要确保目标机器已经开启了硬件虚拟化和 HyperV :在安装的过程中建议 ...
- 快速入门系列--WebAPI--01基础
ASP.NET MVC和WebAPI已经是.NET Web部分的主流,刚开始时两个公用同一个管道,之后为了更加的轻量化(WebAPI是对WCF Restful的轻量化),WebAPI使用了新的管道,因 ...
- saltstack之基础入门系列文章简介
使用saltstack已有一段时间,最近由于各种原因,特来整理了saltstack基础入门系列文章,已备后续不断查阅(俗话说好记性不如烂笔头),也算是使用此工具的一个总结.saltstack的前六篇文 ...
- 【JAVA零基础入门系列】Day2 Java集成开发环境IDEA
开发环境搭建好之后,还需要一个集成开发环境也就是IDE来进行编程.这里推荐的IDE是IDEA,那个老掉牙的Eclipse还是先放一边吧,(手动滑稽). IDEA的下载地址:http://www.jet ...
- 【JAVA零基础入门系列】Day4 变量与常量
这一篇主要讲解Java中的变量,什么是变量,变量的作用以及如何声明,使用变量. 那么什么是变量?对于初学者而言,可以将变量理解为盒子,这些盒子可以用来存放数据,不同类型的数据需要放在对应类型的盒子里. ...
- 【JAVA零基础入门系列】Day5 Java中的运算符
运算符,顾名思义就是用于运算的符号,比如最简单的+-*/,这些运算符可以用来进行数学运算,举个最简单的栗子: 已知长方形的长为3cm,高为4cm,求长方形的面积. 好,我们先新建一个项目,命名为Rec ...
- 【JAVA零基础入门系列】Day6 Java字符串
字符串,是我们最常用的类型,每个用双引号来表示的串都是一个字符串.Java中的字符串是一个预定义的类,跟C++ 一样叫String,而不是Char数组.至于什么叫做类,暂时不做过多介绍,在之后的篇章中 ...
- 【JAVA零基础入门系列】Day8 Java的控制流程
什么是控制流程?简单来说就是控制程序运行逻辑的,因为程序一般而言不会直接一步运行到底,而是需要加上一些判断,一些循环等等.举个栗子,就好比你准备出门买个苹果,把这个过程当成程序的话,可能需要先判断一下 ...
随机推荐
- EF6学习笔记(六) 创建复杂的数据模型
EF6学习笔记总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 本篇原文地址:Creating a More Complex Data Model 本篇讲的比较碎,很多内容本人 ...
- python学习第五章
1.继承 即是一个派生的类(derived class)继承基类(base class)的字段和方法,继承也允许把一个 派生类的对象作为 一个基类 对象对待.通俗来讲就是方便,继承前人的代码,减少工作 ...
- MFC控件的颜色设置
在绘制控件颜色时,控件会发送WM_CTLCOLOR消息给父窗口,父窗口收到消息后,映射到OnCtlColor()函数中处理. 该函数返回一个画刷用于设置子控件的背景颜色,子控件再执行自己的CtlCol ...
- git cmd 命令在已有的仓库重新添加新的文件夹
正确步骤: 1. git init //初始化仓库 git add .(文件name) //添加文件到本地仓库 git commit -m “first commit” //添加文件描述信息 git ...
- commons-text 生成指定长度的随机字符串
package com.skylink.junge.demo; import java.util.HashSet; import java.util.Set; import org.apache.co ...
- Swagger相关配置记录
1.SwaggerConfig文件配置 public class SwaggerConfig { protected static string GetXmlCommentsPath() { retu ...
- 背水一战 Windows 10 (63) - 控件(WebView): 基础知识, 加载 html, http, https, ms-appx-web:///, embedded resource, ms-appdata:///, ms-local-stream://
[源码下载] 背水一战 Windows 10 (63) - 控件(WebView): 基础知识, 加载 html, http, https, ms-appx-web:///, embedded res ...
- 【BZOJ4025】 二分图(线段树分治)
传送门 BZOJ Solution 只是为了学习一下线段树分治的啦! 当你学会线段树分治之后,可以跳过下面的一部分: 按照时间搞一颗线段树出来,把包含这段区间的操作用vector压进去. 每一个线段树 ...
- Android 音乐(音效)播放方式总结
一.音效的分类 音效按照作用的不同,可以将音效分为即时音效和背景音乐.两种音效在Android中的实现技术是不同的. 主要的实现方式为:SoundPool.MediaPlayer. 区别在于,Medi ...
- Java 中 & | ^ 运算符的简单使用
背景 今天碰到了代码中的按位与运算,复习一下,先列一个各个进制数据表. 顺便复习一下十进制转二进制的计算方式: 接下来解释下这三个运算符: & 按位与,都转为二进制的情况下,同为1则为1,否则 ...