Vue学习笔记1——介绍和安装
Vue的学习,第一个主要是为了后面路飞课程的项目。下面开始学习。
1,前端知识点复习
前端包括 html css js (ECMAScript5) jquery bootstrap 响应式
对于ECMAScript6的语法(目的是主要看别人的代码(比如我们从GitHub中下载的),不要看不懂里面的api),其实对于我们前端开发,目前主要是使用ECMAScript5。主流的浏览器有部分ECMAScript6语法不识别。
学习服务器语言node js express 和包管理器 npm (类似于 Python中的 pip install ),一个js文件就是一个包(模块)
jquery.min.js 根python3中 Django pip3类似。
所以 node js (了解) 包管理器 npm(掌握)
学完前后东西后,我们下面学习,学习Vue的基础语法,Vue的高级语法 ,Vue提供的脚手架的东西 vue-cli。webpack(前端中的工具),最后学习设计模式,如何实现单页面应用,前段中的路由。。。。
学习Vue,我们需要复习js的DOM操作(比如说节点的操作,属性的操作,样式属性的操作,值的操作)。事件的复习(事件对象回顾,阻止冒泡,阻止默认事件)。
1.1 路飞课程中Vue的学习内容:
- vue的基础语法
- vue的高级语法
- vue的核心插件(vue-router和vuex)
- vue提供的脚手架的东西:vue-cli webpack(前端中的工具)
- 设计模式 如何在实现单页面应用 前端中的路由......
2,关于es6的一些知识点
下面是es6的网址,如果学习的话,可以参考,这是阮一峰写的,目录如下:
地址: http://es6.ruanyifeng.com/

这里我们学习一些es6的语法,挑一些学习,主要是能看懂别人的代码即可。
2.1,es6中的声明变量
es6使用 声明变量为 let 和 const。
let声明的变量:1,属于局部变量;2 没有覆盖现象
const声明的是常量,一旦声明不可修改;2 const声明的常量属于局部作用域
<script type="text/javascript">
// es5中声明变量 使用var
// console.log(a);
// 变量提升
// var a = 10;
// a = 10;
// 先声明,后赋值
// var a;
// a = 10
// console.log(a);
// console.log(a);
// {
// 因为变量提升,导致var声明的变量属于全局作用域
// var a =20;
// var a = 30;
// 如果不小心写了两个变量,则var后面会覆盖前面
// 所以var声明的变量存在覆盖的现象
// }
// console.log(a);
//两个打印,第一个结果为undefined,下面是20
// var i;
// for(var i=0; i<10;i++){
//
// }
// console.log(i); // i=10 因为i++了
// let 声明的变量属于局部作用域
// 怎么解释呢,就是如果之前没有定义变量名,这里直接使用let
// 则会报错
// const 声明的是常量,常量一旦声明,不可修改
// const 也是局部作用域
const pai=3.1415926;
</script>
2.2,模板字符串
tab 键 上面的反引号,如果你你要拼接一串字符串,那么不需要我们直接的 + 去拼接,使用反引号来拼接,拼接的变量使用 ${变量名称}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<ul>
<!-- <li>-->
<!--<!– 阻止默认事件–>-->
<!-- <a href="javascript:void(0);">-->
<!-- <img src="" alt="">-->
<!-- </a>-->
<!-- </li>-->
</ul>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<script type="text/javascript">
/* es5的语法
let name='james';
let age=34;
var desc='the king ';
// 类似于Python的拼接方式如下:
// var desc1 = name + 'is' + age+'king';
console.log(desc)
*/
/* es6的语法
// 注意 这个不是单引号 是tab键上面的
let name='james';
let age=34;
var desc1 = ${name} + `is` + ${age}+`king`;
console.log(desc)
*/
var imgSrc = 'james.jpg';
$(function () {
$('ul').append(`
<li>
<a href="javascript:void(0);">
<img src=${imgSrc} alt="">
</a>
</li>
`)
})
</script>
</body>
</html>
2.3,函数的书写——箭头函数
es6 箭头函数的使用:
function(){} ====== () => {}
箭头函数的使用带来的问题:
- 1,使用箭头函数 this 的指向发生了改变
- 2,使用箭头函数,arguments不能使用
<script type="text/javascript">
/*
普通函数
function add(a,b) {
return a+b;
};
alert(add(1,2));
*/
/*
// 函数对象
var add = function (a,b) {
return a+b;
};
alert(add(3,4))
*/
/*
var add = (a,b)=>{
return a+b;
};
alert(add(3,7))
*/
/*
var person = {
name:"alex",
age: 20,
fav:function () {
console.log('喜欢NBA');
// this指的是当前的对象
console.log(this.age);
}
};
person.fav();
*/
/*
var person = {
name:"alex",
age: 20,
fav: () => {
// this的指向发生了改变,指向了定义person的父级对象 window
console.log('喜欢NBA');
// this指的是当前的对象
console.log(this);
}
};
person.fav();
*/
/*
var person = {
name:"alex",
age: 20,
fav: function () {
// this的指向发生了改变,指向了定义person的父级对象 window
console.log('喜欢NBA');
// this指的是当前的对象
console.log(this);
console.log(arguments[0])
}
};
person.fav('哈哈哈');
*/
var person = {
name:"alex",
age: 20,
fav: (content) =>{
// this的指向发生了改变,指向了定义person的父级对象 window
console.log('喜欢NBA');
// this指的是当前的对象
console.log(this);
// console.log(arguments)
}
};
person.fav('哈哈哈');
</script>
箭头函数我们使用一般不是很多,主要是能看懂别人的语法。
2.4,对象的创建
对象的单体模式
简单来说 fav(){} 等价于 function fa(){} 等价于 var fav = function(){}
<script type="text/javascript">
// 字面量方式创建对象
/*
var person = {
name:"alex",
age: 20,
fav:function () {
console.log('喜欢NBA');
// this指的是当前的对象
console.log(this.age);
}
};
person.fav();
*/
// es6中对象的单体模式
var person = {
name:"alex",
age: 20,
fav(){
console.log(this);
console.log(arguments);
}
};
person.fav();
</script>
2.5,es6的class的使用
<script type="text/javascript">
// function Person(name, age) {
// this.name = name;
// this.age = age;
// }
//
// Person.prototype.showName = function () {
// alert(this.name);
// };
//
// // 使用new关键字来创建对象
// var p = new Person('james', 34);
// p.showName()
// es6中创建对象的方式,使用class
class Person{
constructor(name, age){
this.name = name;
this.age = age;
}
showName(){
alert(this.name)
}
};
var p1 = new Person('LeBron', 20);
p1.showName()
</script>
2.6,global 对象

3,Vue
Vue是一套用于构建用户界面的渐进式JavaScript框架。与其他大型框架不同的是,Vue被设计为可以自底向上逐层应用。Vue的核心库只关系视图层,方便与第三方库或既有项目整合。
Vue 是渐进式的JavaScript框架: https://cn.vuejs.org/

3.1,前端三大框架的比较
Angular React Vue 作者 google公司 facebook公司 尤雨溪 组织方式 MVC 模块化 模块化 数据绑定 双向绑定 单向绑定 双向绑定 模板能力 强大 自由 自由 自由度 较小 大 较大 路由 静态路由 动态路由 动态路由 文档 中文文档
关于Vue作者尤雨溪简介:请点击我
2,前端框架和库的区别
1,功能上的不同
jQuery库:包含DOM(操作DOM)+ 请求,就是一块功能的实现。
art-template库:模板引擎渲染,高性能的渲染DOM。
框架:大而全的概念,简易的DOM体验 + 请求处理 + 模板引起。
在KFC的世界来看的话,库就是一个小套餐,框架就是全家桶。
2,代码上的不同
一般使用库的代码,是调用某个函数或者使用抛出来的对象,我们自己处理库中的代码。
一般使用框架,框架本身提供好的成套的工具帮助我们运行我们编写好的代码。
3,框架的使用
- 1,初始化自身的一些行为
- 2,执行你所编写的代码
- 3,释放一些资源
3,关于渐进式和自底向上增量开发
我们来看一下知乎的回答:知乎回答
总的来说,它给你提供足够的optional,但并不主张很多required。
我们常说:做减法比做加法难。我觉得一个框架如果是“渐进式”的,就意味着,它本身承担了较难的做减法的部分,而留给它的使用者较简单的做加法的部分。
就是说,在我们用一个工具的时候,并不是为了用其中的某一个部分,而想办法无视或者裁剪掉其他部分(做减法),而是上手就可以用上它的大多数功能,再在需要的时候引入它的官方或第三方插件(做加法)。
4,Vue.js 的优缺点
1.易用
已经会了 HTML、CSS、JavaScript?即刻阅读指南开始构建应用!
2.灵活
不断繁荣的生态系统,可以在一个库和一套完整框架之间自如伸缩。
3.高效
20kB min+gzip 运行大小
超快虚拟 DOM (虚拟dom的渲染速度要比我们真实的dom渲染速度快)
最省心的优化
虚拟的DOM的核心思想是:对复杂的文档DOM结构,提供一种方便的工具,进行最小化地DOM操作。这句话,也许过于抽象,却基本概况了虚拟DOM的设计思想。
- 1,提供一种方便的工具,使得开发效率得到保障
- 2,保障最小化的DOM操作,使得执行效率得到保障
关于虚拟DOM,我们可以认为虚拟DOM的渲染速度要比我们真实的DOM渲染速度快就OK。
5,Vue 的安装使用
5.1,安装
(1) 兼容性
Vue 不支持 IE8 及以下版本,因为 Vue 使用了 IE 8 无法模拟的 ECMAScript 5 特性。但是它支持所有兼容 ECMAScript 5 的浏览器。
(2)Vue Devtools 插件
在使用 Vue 时,推荐在浏览器上安装 Vue Devtools。它允许你在一个更友好的界面中审查和调试 Vue 应用。
(3)直接用 <script> 引入(推荐新手使用)
直接下载并用 <script> 标签引入,Vue 会被注册为一个全局变量。
https://vuejs.org/js/vue.js https://vuejs.org/js/vue.min.js
我们可以下载下来,然后保存到本地,命名即可。
<script type="text/javascript" src="vue.js"></script>
下载可以选择去 npm 下载或者去 vue 官网下载并引入:

(4)cdn 引入
我们推荐链接到一个你可以手动更新的指定版本号:
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
可以在 cdn.jsdelivr.net/npm/vue 浏览 NPM 包的源代码。
Vue 也可以在 unpkg 和 cdnjs 上获取 (cdnjs 的版本更新可能略滞后)。
确认了解不同构建版本并在你发布的站点中使用生产环境版本,把 vue.js 换成 vue.min.js。这是一个更小的构建,可以带来比开发环境下更快的速度体验。(开发环境使用vue.js,生产环境使用vue.min.js)
5.2 nodejs的安装
去官网https://nodejs.org/en/download/ 下载 安装(傻瓜式安装)

打开NodeJS的官网,默认的情况主页就提供了Windows版本的下载链接,我们下载8.11.3 LTS版,LTS代表长期支持版本,一般新手建议使用这个版本,因为这个版本使用的人最多,出问题能找到解决方案的概率较大。如下图所示:

下载完成后双击下载好的nodejs-v8.9.4-x64文件开始安装,点击next进入下一步,勾选同意协议,继续下一步。然后选择安装的位置,默认是在C盘,改成D盘安装,这是个好习惯,建议保持。然后进入模块配置步骤。

然后点点点即可,注意下面这一步:

这一步是选择安装哪些模块,默认是全部安装,对于新手来说建议全部安装。点开那个add path选项前面的+号,我们看到,会主动把NodeJS和NPM这两个模块的命令路径添加到系统路径里,对于我们来说就非常方便了。点击next继续下一步,然后确认信息,点击Install开始安装,然后程序就开始复制文件等一系列步骤。一直到安装完毕。
安装完毕后点击finish结束安装进程,然后在桌面图标上点右键,点运行。输入cmd后敲回车,在打开的命令行界面,依次输入命令:
node -v npm -v
如果正确输出版本号,说明我们的NodeJS和NPM就安装好了,如下图所示:

下载完node之后,会自带包管理器 npm,好比 是python中 pip3包管理器。pip3 install xxx
5.3 npm的使用
1.要初始化npm的项目 :
npm init --yes 自动生成一个package.json文件

package.json 文件如下:
{
"name": "vue_learnnote",
"version": "1.0.0",
"description": "this is my first vue project",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "LeBron-jian",
"license": "ISC",
"dependencies": {
"vue": "^2.6.11"
}
}
2.npm install vue --save npm install jquery --save
安装vue1的版本可以这样安装 np, install vue@1 --save 意思是下载vue1的最高版本。

3.下载包 npm uninstall vue --save
4.下载所有的依赖包 npm install
5.4 nodejs是用来干什么的
下面学习一下避开高端术语的同时,理解一下 node.js。
浏览器给网站发送请求的过程一直没怎么变过。当浏览器给网站发了请求。服务器收到了请求,然后开始搜寻被请求的资源。如果有需要,服务器还会查询一下数据库,最后把响应结果传回浏览器。不过,在传统的web服务器中(比如Apache),每一个请求都会让服务器创建一个新的进程来处理这个请求。
后来有了Ajax,有了Ajax,我们就不用每次都请求一个完整的新页面了,取而代之的是,每次只请求需要的部分页面信息就可以了。这显然是一个进步。但是比如你要创建一个Fiend Feed这样的社交网站(类似于人人网那样的刷盆友新闻事的网站),你的好友会随时的推送新的状态,然后你的新鲜事会实时自动刷新。要达成这个需求,我们需要让用户一直与服务器把持一个有效链接,目前最简单的实现方法,就是让用户和服务器之间保持长轮询(long polling)。
HTTP 请求不是持续的链接,你请求一次,服务相应一次,然后就完了。长轮询是一种利用HTTP模拟持续链接的技巧。具体来说,只要页面载入了,不管你需不需要服务器给你相应信息,你都会给服务器发一个Ajax请求。这个请求不同于一般的Ajax请求,服务器不会直接给你返回信息,而是他要等着,直到服务器觉得该给你发信息了,它才回相应。比如你的好友发了一条新鲜事,服务器就把这个新鲜事当作响应发给你的浏览器,然后你的浏览器就刷新页面了,浏览器收到相应刷新完之后,再发送一条新的请求给服务器,这个请求不会立即被响应。于是就开始重复以上步骤。利用这个方法,可以让浏览器始终保持等待响应的状态。虽然以上过程依然只有非持续的HTTP参与,但是我们模拟处一个看似连续的链接状态。
我们再看传统的服务器(比如Apache)。每次一个新的用户连到你的网站上,你的服务器就得开一个连接。每个连接需要占用一个进程,这些进程大部分时间都是闲着的(比如等待你好友发送新鲜事,等好友发送完才给用户响应信息。或者等着数据库返回查询结果什么的)。虽然这些进程闲着,但是照样占用内存。这意味着,如果用户连接数的增长到一定规模,你服务器没准就要耗光内存直接瘫痪了。
这种情况怎么解决呢?解决方法就是刚才上面说的:非阻塞和事件驱动。这些概念在我们谈的这个情景里面其实没有那么难理解。你把这个非阻塞的服务器想象成一个loop循环,这个loop会一直跑下去。一个新的进程来了,这个loop就接了这个请求,把这个请求传给其他的进程(比如传给一个搞数据库查询的进程),然后响应一个回调(callback)。完事了这loop纠结着跑,接其他的请求,这样下来,服务器就不会像之前那样傻着等着数据库返回结果了。
如果数据库把结果返回来了,loop就把结果传回用户的浏览器,接着继续跑,在这种方式下,你的服务器的进程就不会闲着等着。从而在理论上说,同一时刻的数据库查询数量,以及用户的请求数量就没有限制了。服务器只在用户那边有事件发生的时候才响应,这就是事件驱动。
FriendFeed是用基于Python的非阻塞框架Tornado (知乎也用了这个框架) 来实现上面说的新鲜事功能的。不过,Node.js就比前者更妙了。Node.js的应用是通过javascript开发的,然后直接在Google的变态V8引擎上跑。用了Node.js,你就不用担心用户端的请求会在服务器里跑了一段能够造成阻塞的代码了。因为javascript本身就是事件驱动的脚本语言。你回想一下,在给前端写javascript的时候,更多时候你都是在搞事件处理和回调函数。javascript本身就是给事件处理量身定制的语言。
Node.js还是处于初期阶段。如果你想开发一个基于Node.js的应用,你应该会需要写一些很底层代码。但是下一代浏览器很快就要采用WebSocket技术了,从而长轮询也会消失。在Web开发里,Node.js这种类型的技术只会变得越来越重要。
5.5 查看安装的Vue项目
下面查看vue项目,我们只关心 vue.js 和 vue.min.js文件,下面的是速度,我们暂时关心vue.js 和 vue.min.js
前面的是开发的js,后面的是上线测试的js:

当我们下载了Vue后,我们查看 package.json:

5.6,引入 vue.js 文件
这里是开发环境,因此选用 vue.js
<body>
<!--1.先引包-->
<!--<script src="js/vue.js"></script>-->
<script type="text/javascript" src="./node_modules/vue/dist/vue.js"></script>
<script type="text/javascript">
</script>
</body>
引入 vue.js 文件后,Vue被注册为一个全局的变量,是一个构造函数。在网站控制台查看:

6,使用Vue实例化对象
6.1,创建 vue 实例对象
每个Vue应用都是通过Vue函数创建一个新的Vue实例开始的:
<body>
<div id="app">
<h3>{{title}}</h3>
<p>{{msg}}</p>
</div>
<script src="js/vue.js"></script>
<script>
// 创建vue实例对象
var app = new Vue({
el: "#app", // 元素
// 所有的数据都放在数据属性里
data: {
title: "NBA",
msg: "james"
}
})
</script>
</body>
已经简单的创建了第一个Vue 应用。渲染的数据方式我们也叫声明式的渲染。现在数据和DOM已经被建立了关联,所有东西都是响应式的。我们要怎么确认呢?打开你的浏览器的JavaScript 控制台(就在这个页面打开),并修改 app.msg 的值,你将看到上例相应的更新。
6.2,模板语法
{{}} 模板语法:主要作用是插值,不仅可以插变量,只要你能想到的插入都可以(if-else 不可以)。
<body>
<div id="app">
<h3>{{msg}}</h3>
<!--字符串拼接-->
<h3>{{msg + 'hello'}}</h3>
<!--三目运算符-->
<h3>{{1>2?"真的":"假的"}}</h3>
<!--可以插入字符串-->
<h4>{{'helloworld'.split('').reverse().join('')}}</h4>
<!--不能使用if-else-->
<!--{{}}模板语法的设计,只是为了简单的运算-->
</div>
<!--1.先引包-->
<!--<script src="js/vue.js"></script>-->
<script type="text/javascript" src="./node_modules/vue/dist/vue.js"></script>
<script type="text/javascript">
// 2.创建vue实例化对象
new Vue({
el: '#app', // 目的地
data:{ // data属性可以是函数或对象
msg: 'hello Vue' // 数据属性
}
})
</script>
</body>
注意:
1)data属性可以是一个函数也可以是一个对象。msg是数据属性。依靠数据驱动视图(模板语法),将数据(msg)渲染到DOM(标签也就是view)中。
2)模板语法中不能使用if-else。
3)Vue实例化对象后,这个对象中属性前面都有前缀 $,主要是为了跟我们自定义的属性区分。

6.3, app.$el 对象问题
(1)app.$el 对象等价于对应标签所有内容
<body>
<div id="app">
<h3>{{msg}}</h3>
<!--字符串拼接-->
<h3>{{msg + 'hello'}}</h3>
<!--三目运算符-->
<h3>{{1>2?"真的":"假的"}}</h3>
</div>
<!--1.先引包-->
<!--<script src="js/vue.js"></script>-->
<script type="text/javascript" src="./node_modules/vue/dist/vue.js"></script>
<script type="text/javascript">
// 2.创建vue实例化对象
var app = new Vue({ // 这样定义,实例化有返回值
el: '#app', // 目的地
data:{ // data属性可以是函数或对象
msg: 'hello Vue', // 数据属性
}
});
console.log(app);
console.log(app.$el);
console.log(app.$el === document.getElementById('app'));
</script>
</body>
(2) el 和 template 的优先级问题
template 的优先级要高于 el,具体情况如下图所示:
1) 当代码只定义了 el 和模板语法时:
<body>
<div id="app">
<h3>{{msg}}</h3>
</div>
<script type="text/javascript" src="./node_modules/vue/dist/vue.js"></script>
<script type="text/javascript">
new Vue({
el: '#app',
data: {
msg: 'hello指令系统',
},
//template:`<h4>{{msg}}</h4>>`
})
</script>
</body>
模板在 APP标签下,效果如下所示:

2) 当代码也定义了 template时:
<body>
<div id="app">
<h3>{{msg}}</h3>
</div>
<script type="text/javascript" src="./node_modules/vue/dist/vue.js"></script>
<script type="text/javascript">
new Vue({
el: '#app',
data: {
msg: 'hello指令系统',
},
template:`<h4>{{msg}}</h4>>`
})
</script>
</body>
msg没有渲染到el中,如下图所示:

7,Vue 应用的组成结构
一个 Vue 应用由一个通过 new Vue 创建的根 Vue 实例,以及可选的嵌套的、可复用的组件树组成。举个例子,一个 todo 应用的组件树可以是这样的:
根实例
└─ TodoList
├─ TodoItem
│ ├─ DeleteTodoButton
│ └─ EditTodoButton
└─ TodoListFooter
├─ ClearTodosButton
└─ TodoListStatistics
参考文献:https://www.cnblogs.com/xiugeng/p/9614731.html#top

浙公网安备 33010602011771号