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的控制流程
		什么是控制流程?简单来说就是控制程序运行逻辑的,因为程序一般而言不会直接一步运行到底,而是需要加上一些判断,一些循环等等.举个栗子,就好比你准备出门买个苹果,把这个过程当成程序的话,可能需要先判断一下 ... 
随机推荐
- 三.mysql表的完整性约束
			mysql表的完整性约束 什么是约束 not null 不能为空的 unique 唯一 = 不能重复 primary key 主键 = 不能为空 且 不能重复 foreign key ... 
- Build.gradle的详细配置说明
			转自:http://blog.csdn.net/u012246458/article/details/51722624 apply plugin: 'com.android.application'/ ... 
- Centos6.5安装中文支持和中文输入法
			先来讲中文支持: 之前在网上查了不少资料,很多网友在网上都说,在shell命令下输入: # vi /etc/sysconfig/i18n 然后修改LANG="en_US.UTF-8& ... 
- 学习WPF——使用Font-Awesome图标字体(一)
			一.运行效果图 二.图标字体文件下载 http://fontawesome.dashgame.com/(这个网址可以下载图标字体文件) http://www.fontawesome.com.cn/(这 ... 
- 如何运用kali-xplico网络取证分析?点开看看吧
			0x00前言: 本工具仅供安全技术学习和教育用途,禁止非法使用! 前方高能 建议物理机选作,虚拟机快照,万一你那个东西做错了,我还得背锅0x01介绍: Xplico网络数据取证工具 ... 
- vue-cli脚手架项目按需引入elementUI
			https://www.jianshu.com/p/40da0ba35ac1 Couldn't find preset "es2015" relative to directory ... 
- Maven 如何发布 jar 包到 Nexus 私库
			Nexus2可以通过管理界面来上传jar包到私库中,而最新的Nexus3却找不到了上传界面,只能通过以下方式来发布到私库. 发布第三方jar包 这种情况是maven远程仓库没有,本地有的第三方jar包 ... 
- 如何开始DDD
			在开始DDD之前,你需要了解DDD的一些基础知识,聚合(AggregateRoot).实体(Entity).值对象(ValueObject),工厂(Factory),仓储(Repository)和领域 ... 
- dotnet new 命令使用模板生成Angular应用
			dotnet new 命令使用模板快速生成单页应用,本文以Angular应用为例. 最新版.NET Core SDK RC4 最大改动是更新了 dotnet new 命令. dotnet new 默认 ... 
- Docker总结(脑图图片)
