vue从入门到进阶:简介(一)

前言

用了这么久的vue了,但是一直没有时间写个系列文章,现在抽一定时间总结下vue的知识点。

首先,Vue 不支持 IE8 及以下版本,因为 Vue 使用了 IE8 无法模拟的 ECMAScript 5 特性。但它支持所有兼容 ECMAScript 5 的浏览器。
下面总结的内容是在2.x的版本。

安装

直接用 <script> 引入

直接下载并用 <script> 标签引入,Vue 会被注册为一个全局变量。

在开发环境下不要使用压缩版本,不然你就失去了所有常见错误相关的警告!

CDN

推荐:https://cdn.jsdelivr.net/npm/vue,会保持和 npm 发布的最新的版本一致。可以在 https://cdn.jsdelivr.net/npm/vue/ 浏览 npm 包资源。
也可以从 unpkg cdnjs 获取 (cdnjs 的版本更新可能略滞后)。

NPM

在用 Vue 构建大型应用时推荐使用 NPM 安装。NPM 能很好地和诸如 webpack Browserify 模块打包器配合使用。同时 Vue 也提供配套工具来开发单文件组件。

# 最新稳定版
$ npm install vue

命令行工具 (CLI)

快速搭建大型单页应用,只需几分钟即可创建并启动一个带热重载、保存时静态检查以及可用于生产环境的构建配置的项目:

# 全局安装 vue-cli
$ npm install --global vue-cli
# 创建一个基于 webpack 模板的新项目
$ vue init webpack my-project
# 安装依赖,走你
$ cd my-project
$ npm install
$ npm run dev

开发版本

GitHub 仓库的 /dist 文件夹只有在新版本发布时才会提交。如果想要使用 GitHub 上 Vue 最新的源码,你需要自己构建!

git clone https://github.com/vuejs/vue.git node_modules/vue
cd node_modules/vue
npm install
npm run build

第一个程序Hello Vue

<div id="app">{{ message }}
</div>
var app = new Vue({el: '#app',data: {message: 'Hello Vue!'}
})

现在数据和 DOM 已经被建立了关联,所有东西都是响应式的。我们要怎么确认呢?打开你的浏览器的 JavaScript 控制台 (就在这个页面打开),并修改 app.message 的值

vue核心最基本的功能

声明式渲染

给某一个DOM元素绑定属性,如下

<div id="app"><span v-bind:title="message">鼠标悬停几秒钟查看此处动态绑定的提示信息!</span>
</div>

JS代码:

var app = new Vue({el: '#app',data: {message: '页面加载于 ' + new Date().toLocaleString()}
})

其中上面用到的v-bind 特性被称为指令

条件与循环

控制切换一个元素是否显示也相当简单:

<div id="app"><p v-if="seen">现在你看到我了</p>
</div>
var app = new Vue({el: '#app',data: {seen: true}
})

v-for 指令可以绑定数组的数据来渲染一个项目列表:

<div id="app"><ol><li v-for="todo in todos">{{ todo.text }}</li></ol>
</div>
var app = new Vue({el: '#app',data: {todos: [{ text: '学习 JavaScript' },{ text: '学习 Vue' },{ text: '整个牛项目' }]}
})

在控制台里,输入 app.todos.push({ text: '新项目' }),你会发现列表最后添加了一个新项目。

处理用户输入

Vue 提供了 v-model 指令,它能轻松实现表单输入和应用状态之间的双向绑定。

<div id="app"><p>{{ message }}</p><input v-model="message">
</div>
var app = new Vue({el: '#app',data: {message: 'Hello Vue!'}
})

组件化应用构建

重要:需要明白所有的 Vue 组件都是 Vue 实例,并且接受相同的选项对象 (一些根实例特有的选项除外)。

组件系统是 Vue 的另一个重要概念,因为它是一种抽象,允许我们使用小型、独立和通常可复用的组件构建大型应用。仔细想想,几乎任意类型的应用界面都可以抽象为一个组件树:

在 Vue 里,一个组件本质上是一个拥有预定义选项的一个 Vue 实例。在 Vue 中注册组件很简单:

// 定义名为 todo-item 的新组件
Vue.component('todo-item', {template: '<li>这是个待办项</li>'
})

现在你可以用它构建另一个组件模板:

<ol><!-- 创建一个 todo-item 组件的实例 --><todo-item></todo-item>
</ol>

但是这样会为每个待办项渲染同样的文本,这看起来并不炫酷。我们应该能从父作用域将数据传到子组件才对。让我们来修改一下组件的定义,使之能够接受一个 prop

Vue.component('todo-item', {// todo-item 组件现在接受一个// "prop",类似于一个自定义特性。// 这个 prop 名为 todo。props: ['todo'],template: '<li>{{ todo.text }}</li>'
})

现在,我们可以使用 v-bind 指令将待办项传到循环输出的每个组件中:

<div id="app"><ol><!--现在我们为每个 todo-item 提供 todo 对象todo 对象是变量,即其内容可以是动态的。我们也需要为每个组件提供一个“key”,稍后再作详细解释。--><todo-itemv-for="item in groceryList"v-bind:todo="item"v-bind:key="item.id"></todo-item></ol>
</div>
Vue.component('todo-item', {// todo-item 组件现在接受一个// "prop",类似于一个自定义特性。// 这个 prop 名为 todo。props: ['todo'],template: '<li>{{ todo.text }}</li>'
})var app = new Vue({el: '#app',data: {groceryList: [{ id: 0, text: '蔬菜' },{ id: 1, text: '奶酪' },{ id: 2, text: '随便其它什么人吃的东西' }]}
})

这个例子子单元通过 prop 接口与父单元进行了良好的解耦。我们现在可以进一步改进 <todo-item> 组件,提供更为复杂的模板和逻辑,而不会影响到父单元。
在一个大型应用中,有必要将整个应用程序划分为组件,以使开发更易管理

<div id="app"><app-nav></app-nav><app-view><app-sidebar></app-sidebar><app-content></app-content></app-view>
</div>

组件与自定义元素的关系

你可能已经注意到 Vue 组件非常类似于自定义元素——它是 Web 组件规范的一部分,这是因为 Vue 的组件语法部分参考了该规范。例如 Vue 组件实现了 Slot API 与 is 特性。但是,还是有几个关键差别:

  • Web 组件规范仍然处于草案阶段,并且未被所有浏览器原生实现。相比之下,Vue 组件不需要任何 polyfill,并且在所有支持的浏览器 (IE9 及更高版本) 之下表现一致。必要时,Vue 组件也可以包装于原生自定义元素之内。
  • Vue 组件提供了纯自定义元素所不具备的一些重要功能,最突出的是跨组件数据流、自定义事件通信以及构建工具集成。

剖析一个完整的vue实例

数据与方法

当一个 Vue 实例被创建时,它向 Vue 的响应式系统中加入了其 data 对象中能找到的所有的属性。当这些属性的值发生改变时,视图将会产生“响应”,即匹配更新为新的值。

// 我们的数据对象
var data = { a: 1 }// 该对象被加入到一个 Vue 实例中
var vm = new Vue({data: data
})// 它们引用相同的对象!
vm.a === data.a // => true// 设置属性也会影响到原始数据
vm.a = 2
data.a // => 2// ……反之亦然
data.a = 3
vm.a // => 3

重要:当这些数据改变时,视图会进行重渲染。值得注意的是只有当实例被创建时 data 中存在的属性才是响应式的。也就是说如果你添加一个新的属性,比如:vm.b = 'hi'

那么对 b 的改动将不会触发任何视图的更新。如果你知道你会在晚些时候需要一个属性,但是一开始它为空或不存在,那么你仅需要设置一些初始值。比如:

data: {newTodoText: '',visitCount: 0,hideCompletedTodos: false,todos: [],error: null
}

我们也可以使用ES6标准中提供的一个方法Object.freeze(),其方法作用就是冻结对象,对对象中的属性进行修改无效。也即是会阻止修改现有的属性,也意味着响应系统无法再追踪变化

var obj = {foo: 'bar'
}Object.freeze(obj)new Vue({el: '#app',data () {return {obj}}
})
<div id="app"><p>{{ obj.foo }}</p><!-- 这里的 `obj.foo` 不会更新! --><button @click="obj.foo = 'baz'">Change it</button>
</div>

除了数据属性,Vue 实例还暴露了一些有用的实例属性与方法。它们都有前缀 $,以便与用户定义的属性区分开来。例如:

var data = { a: 1 }
var vm = new Vue({el: '#example',data: data
})vm.$data === data // => true
vm.$el === document.getElementById('example') // => true// $watch 是一个实例方法
vm.$watch('a', function (newValue, oldValue) {// 这个回调将在 `vm.a` 改变后调用
})

实例生命周期钩子

每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给了用户在不同阶段添加自己的代码的机会。

比如 created 钩子可以用来在一个实例被创建之后执行代码:

new Vue({data: {a: 1},created: function () {// `this` 指向 vm 实例console.log('a is: ' + this.a)}
})
// => "a is: 1"

也有一些其它的钩子,在实例生命周期的不同阶段被调用,如 mountedupdateddestroyed。生命周期钩子的 this 上下文指向调用它的 Vue 实例。

不要在选项属性或回调上使用箭头函数,比如 created: () => console.log(this.a) vm.$watch('a', newValue => this.myMethod())。因为箭头函数是和父级上下文绑定在一起的,this 不会是如你所预期的 Vue 实例,经常导致 Uncaught TypeError: Cannot read property of undefined Uncaught TypeError: this.myMethod is not a function 之类的错误。

生命周期图示

下图展示了实例的生命周期。你不需要立马弄明白所有的东西,不过随着你的不断学习和使用,它的参考价值会越来越高。

注:特别有用

转载于:https://www.cnblogs.com/moqiutao/p/8258353.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux堡垒机开源软件,Jumpserver开源堡垒机

Jumpserver开源跳板机系统部署1.简介Jumpserver使用Python / Django进行开发&#xff0c;遵循Web 2.0规范&#xff0c;配备了业界领先的Web Terminal解决方案&#xff0c;交互界面美观、用户体验好。Jumpserver采纳分布式架构&#xff0c;支持多机房跨区域部署&#xff0c;中心…

node截图服务可用性报告

2019独角兽企业重金招聘Python工程师标准>>> 前言 服务器端截图可以做什么&#xff1f; 个人观点&#xff1a;省去跟报表有关的EDM开发&#xff0c;直接从系统上截图&#xff0c;然后发图片给用户就搞定。剩下的自己脑补。 既然这么好&#xff0c;为毛不赶紧弄。…

C++的extern关键字

extern是一个声明&#xff0c;不是一个定义&#xff0c;A模块想应用B模块的一个函数或者变量&#xff0c;A模块包含B模块的头文件&#xff0c;并且在变量或者头文件前&#xff0c;加 extern&#xff0c;虽然编译的时候&#xff0c;找不到模块的定义&#xff0c;但是在连接的时候…

Linux网站访问的电脑占CPU,详解Linux如何查看当前占用CPU或内存最多的几个进程...

命令ps -aux | sort -k4nr | head -N命令详解&#xff1a;1、head&#xff1a;-N可以指定显示的行数&#xff0c;默认显示10行。2、ps&#xff1a;参数a指代all——所有的进程&#xff0c;u指代userid——执行该进程的用户id&#xff0c;x指代显示所有程序&#xff0c;不以终端…

Hi,博客园

Hi&#xff0c;博客园&#xff01; 这是我在博客园的第一篇博文&#xff0c;主要是为了测试发布。 在以后的日子里我会陆续介绍ArcGIS soft的使用及Flex和JS的开发&#xff0c;以及开源GIS的开发&#xff0c;敬请关注。转载于:https://www.cnblogs.com/unitgis/p/4028171.html

java反射快速入门(二)

上一遍博文 , 简单介绍java 反射的常用接口,本遍博文, 我会结合项目开发的实际例子讲解下 java反射的使用 现在有个需求, 要将一个对象转换成xml格式, 或者将一串xml转换一个对象, 这时我们循序渐进, 先从最简单的入手 一&#xff1a; 方案① 场景 &#xff1a; NBA球员信息描述…

Myecplise Tomcat 启动很慢

今天突然遇到一个问题&#xff0c;tomcat在Myecplse启动非常慢&#xff0c;直接用tomcat自带的start.bat启动很快&#xff0c;如果通过Myeclipse启动会发现项目一直在实例化&#xff0c;最后发现是因为加了断点调试&#xff0c;断点忘了去掉了&#xff0c;这个恰恰影响了spring…

C#QQ邮箱验证

注意&#xff1a; QQ邮箱的简单邮件传输协议&#xff08;SMTP&#xff09;使用了SSL加密&#xff0c;必须启用SSL加密、指定端口。 QQ邮箱POP3/SMTP服务默认是关闭的&#xff0c;需要开启服务&#xff08;设置>账户>开启服务&#xff09;。 QQ邮箱若有独立密码&#xff0…

linux 文件 重命名 缓存,linux – rename()原子性和NFS?

参考&#xff1a;Is rename() atomic?我问的是类似的东西,但不完全相同,因为我想知道的是在使用NFS时依赖于rename()的原子性是否安全&#xff1f;这是我正在处理的一个场景 – 我有一个必须始终存在的’索引’文件.所以&#xff1a;>客户端创建一个新文件>客户端通过“…

Win2008上.NET4.0部署出错HTTP 错误 500.21 - Internal Server Error的解决方法

原因&#xff1a;在安装Framework v4.0之后&#xff0c;再启用IIS&#xff0c;导致Framework没有完全安装 解决&#xff1a;开始->所有程序->附件->鼠标右键点击“命令提示符”->以管理员身份运行&#xff0c;输入以下命令&#xff1a; %windir%\\Microsoft.NET\\F…

ORACLE DATAGURARD配置手记

经过多次实践&#xff0c;参阅网上N多文章……最后还是配不成&#xff0c;可能本人悟性太低&#xff0c;无法体会高手的笔记。最终还是在前辈的帮助下完成。特用最平实的手法记录下来&#xff0c;以便如吾辈菜鸟能 看得懂。 运行Data Guard的条件 1、 在主库和从库的所有机器上…

浅谈ASP.NET框架

本篇文章更适合具有一定开发经验&#xff0c;一定功底&#xff0c;且对底层代码有所研究的朋友&#xff01;&#xff01;&#xff01; 本篇文章稍微偏原理且底层&#xff0c;有一定难度和且比较晦涩&#xff0c;文章粒度稍微粗些&#xff0c;更细粒度的&#xff0c;会在后续的文…

C语言之冒泡排序

假设要对含有n个数的序列进行升序排列&#xff0c;冒泡排序算法步骤是&#xff1a; 1、从存放序列的数组中的第一个元素开始到最后一个元素&#xff0c;依次对相邻两数进行比较&#xff0c;若前者大后者小&#xff0c;则交换两数的位置&#xff1b; 2、第1趟结束后&#xff0c;…

eclipse常用的快捷键

2014年10月17日10:29:50 1.CtrlSpace 说明:内容助理。提供对方法,变量,参数,javadoc等得提示, 应运在多种场合,总之需要提示的时候可先按此快捷键。 注:避免输入法的切换设置与此设置冲突 2.Ctrl/ 说明:添加/消除//注释,在eclipse2.0中,消除注释为Ctrl\ 3.CtrlShift/ 说明:添加…

linux sar 历史负载,查看负载、vmstat、top、sar以及nload命令

使用w查看系统负载1.w命令&#xff0c;查看系统负载&#xff1a;单位时间内使用cpu的活动的进程有多少个[rootweix01 ~]# w #load average 后面三个数字表示1分钟&#xff0c;5分钟&#xff0c;15分钟的负载值&#xff0c;最合适的是逻辑cpu数量与1分钟负载一致21:10:21 up 8 m…

【HDOJ】4358 Boring counting

基本思路是将树形结构转线性结构&#xff0c;因为查询的是从任意结点到叶子结点的路径。从而将每个查询转换成区间&#xff0c;表示从该结点到叶子结点的路径。离线做&#xff0c;按照右边界升序排序。利用树状数组区间修改。树状数组表示有K个数据的数量&#xff0c;利用pos进…

linux系统编程:IO读写过程的原子性操作实验

所谓原子性操作指的是&#xff1a;内核保证某系统调用中的所有步骤&#xff08;操作&#xff09;作为独立操作而一次性加以执行&#xff0c;其间不会被其他进程或线程所中断。 举个通俗点的例子&#xff1a;你和女朋友OOXX的时候&#xff0c;突然来了个电话&#xff0c;势必会打…

Intent.createChooser文件选择

实现点击Button选择文件, 在TextView上显示Uri 1 <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"2 xmlns:tools"http://schemas.android.com/tools"3 android:layout_width"match_parent"4 android…

c语言 数组扩容,数组的扩容

用数组模拟栈数组是固定大小的&#xff0c;不能改变长度&#xff0c;要想达到数组扩容的目的&#xff0c;就只能把当前数组复制到一个更长长度的数组中&#xff1b;使用Arrays.copyOf()方法源码如下&#xff1a;public static short[] copyOf(short[] original, int newLength)…

ubuntu修改固定ip

1.vi /etc/network/interfasces,添加红框内的内容&#xff1a; 2.配置DNS, vi /etc/resolv.conf, 再该文件下添加&#xff1a; nameserver 192.168.1.1 nameserver 220.170.64.68 3.改完上面&#xff0c;如果重启的话&#xff0c;还是会变为原来的样子&#xff0c;所以要让其永…