背景叙述

渐进式 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 系列之 基础入门的更多相关文章

  1. 「译」JUnit 5 系列:基础入门

    原文地址:http://blog.codefx.org/libraries/junit-5-basics/ 原文日期:25, Feb, 2016 译文首发:Linesh 的博客:JUnit 5 系列: ...

  2. Docker 系列之 基础入门

    安装 Docker Windows 10 专业版以上版本 Docker for Windows Installer 在安装前,需要确保目标机器已经开启了硬件虚拟化和 HyperV :在安装的过程中建议 ...

  3. 快速入门系列--WebAPI--01基础

    ASP.NET MVC和WebAPI已经是.NET Web部分的主流,刚开始时两个公用同一个管道,之后为了更加的轻量化(WebAPI是对WCF Restful的轻量化),WebAPI使用了新的管道,因 ...

  4. saltstack之基础入门系列文章简介

    使用saltstack已有一段时间,最近由于各种原因,特来整理了saltstack基础入门系列文章,已备后续不断查阅(俗话说好记性不如烂笔头),也算是使用此工具的一个总结.saltstack的前六篇文 ...

  5. 【JAVA零基础入门系列】Day2 Java集成开发环境IDEA

    开发环境搭建好之后,还需要一个集成开发环境也就是IDE来进行编程.这里推荐的IDE是IDEA,那个老掉牙的Eclipse还是先放一边吧,(手动滑稽). IDEA的下载地址:http://www.jet ...

  6. 【JAVA零基础入门系列】Day4 变量与常量

    这一篇主要讲解Java中的变量,什么是变量,变量的作用以及如何声明,使用变量. 那么什么是变量?对于初学者而言,可以将变量理解为盒子,这些盒子可以用来存放数据,不同类型的数据需要放在对应类型的盒子里. ...

  7. 【JAVA零基础入门系列】Day5 Java中的运算符

    运算符,顾名思义就是用于运算的符号,比如最简单的+-*/,这些运算符可以用来进行数学运算,举个最简单的栗子: 已知长方形的长为3cm,高为4cm,求长方形的面积. 好,我们先新建一个项目,命名为Rec ...

  8. 【JAVA零基础入门系列】Day6 Java字符串

    字符串,是我们最常用的类型,每个用双引号来表示的串都是一个字符串.Java中的字符串是一个预定义的类,跟C++ 一样叫String,而不是Char数组.至于什么叫做类,暂时不做过多介绍,在之后的篇章中 ...

  9. 【JAVA零基础入门系列】Day8 Java的控制流程

    什么是控制流程?简单来说就是控制程序运行逻辑的,因为程序一般而言不会直接一步运行到底,而是需要加上一些判断,一些循环等等.举个栗子,就好比你准备出门买个苹果,把这个过程当成程序的话,可能需要先判断一下 ...

随机推荐

  1. android-基础编程-ToolBar

    Android 3.0  Android 推了 ActionBar 这个控件,而到了2013 年 (4.0)Google 开始大力地推动所谓的 android style,material desig ...

  2. PHP 文件处理----fopen(),fclose(),feof(),fgets(),fgetc()

    fopen() 函数用于在 PHP 中打开文件. 打开文件 fopen() 函数用于在 PHP 中打开文件. 此函数的第一个参数含有要打开的文件的名称,第二个参数规定了使用哪种模式来打开文件: < ...

  3. 《mysql必知必会》学习_第14章_20180806_欢

    第14章:使用子查询. 子查询是镶嵌在其他查询里面,相当其他的select查询的条件来. P91 select order_num from where prod_id='tnt2';   #检索条件 ...

  4. Windows 远程栈溢出挖掘与利用

    缓冲区溢出攻击很容易被攻击者利用,因为 C 和 C++等语言并没有自动检测缓冲区溢出操作,同时程序编写人员在编写代码时也很难始终检查缓冲区是否可能溢出.利用溢出,攻击者可以将期望数据写入漏洞程序内存中 ...

  5. Android 网络交互之下载断点续传

    一.概述 1.概念 断点续传主要用于下载,本文也主要讲述下载时的断点续传的逻辑思路.顾名思义,断点续传就是下载从中断的地方继续下载,一般是因为暂停或者网络故障导致的下载中断,当恢复下载的时候可以从已经 ...

  6. 撰写一篇博客要求讲述四则运算2的设计思想,源程序代码、运行结果截图、编程总结分析,并按照PSP0级的要求记录开发过程中的时间记录日志。

    一.撰写一篇博客要求讲述四则运算2的设计思想,源程序代码.运行结果截图.编程总结分析,并按照PSP0级的要求记录开发过程中的时间记录日志. 1.设计思想: ①创建test.jsp建立第一个前端界面,提 ...

  7. C语言中全局结构体指针隐含的错误

    前天在嵌入式系统上,调试一个数组的全局变量时,发现该变量一直会动态变化.深入分析, 才发现该全局结构体没有申请内存,而是用了一个指针.这种情况编译器是检查不出来的,在linux 上运行会挂掉,但是在裸 ...

  8. Python函数学习——初步认识

    函数使用背景 假设老板让你写一个监控程序,24小时全年无休的监控你们公司网站服务器的系统状况, 当cpu\memory\disk等指标的使用量超过阀值时即发邮件报警, 你掏空了所有的知识量,写出了以下 ...

  9. JavaScript防篡改对象

    不可扩展对象 默认情况下,所有对象都是可扩展的,使用Object.preventExtensions()方法可以改变这一行为. var person = { name: "Hiram&quo ...

  10. 程序员、互联网从业者必读KK凯文凯利三大力作之《失控》总结