vue.js默认没有提供ajax功能的。javascript
因此使用vue的时候,通常都会使用axios的插件来实现ajax与后端服务器的数据交互。php
注意,axios本质上就是javascript的ajax封装,因此会被同源策略限制。css
下载地址:html
https://unpkg.com/axios@0.18.0/dist/axios.js https://unpkg.com/axios@0.18.0/dist/axios.min.js
axios提供发送请求的经常使用方法有两个:axios.get() 和 axios.post() 。前端
增 postvue
删 deletejava
改 putnode
查 getpython
// 发送get请求 // 参数1: 必填,字符串,请求的数据接口的url地址,例如请求地址:http://www.baidu.com?id=200 // 参数2:可选,json对象,要提供给数据接口的参数 // 参数3:可选,json对象,请求头信息 axios.get('服务器的资源地址',{ // http://www.baidu.com params:{ 参数名:'参数值', // id: 200, } }).then(function (response) { // 请求成功之后的回调函数 console.log("请求成功"); console.log(response); }).catch(function (error) { // 请求失败之后的回调函数 console.log("请求失败"); console.log(error.response); }); // 发送post请求,参数和使用和axios.get()同样。 // 参数1: 必填,字符串,请求的数据接口的url地址 // 参数2:必填,json对象,要提供给数据接口的参数,若是没有参数,则必须使用{} // 参数3:可选,json对象,请求头信息 axios.post('服务器的资源地址',{ username: 'xiaoming', password: '123456' },{ responseData:"json", }) .then(function (response) { // 请求成功之后的回调函数 console.log(response); }) .catch(function (error) { // 请求失败之后的回调函数 console.log(error); }); // b'firstName=Fred&lastName=Flintstone'
json是 JavaScript Object Notation 的首字母缩写,单词的意思是javascript对象表示法,这里说的json指的是相似于javascript对象的一种数据格式。react
json的做用:在不一样的系统平台,或不一样编程语言之间传递数据。
json数据对象相似于JavaScript中的对象,可是它的键对应的值里面是没有函数方法的,值能够是普通变量,不支持undefined,值还能够是数组或者json对象。
// json数据的对象格式: { "name":"tom", "age":18 } // json数据的数组格式: ["tom",18,"programmer"]
复杂的json格式数据能够包含对象和数组的写法。
{ "name":"小明", "age":200, "fav":["code","eat","swim","read"], "son":{ "name":"小小明", "age":100, "lve":["code","eat"], } } // 数组结构也能够做为json传输数据。
json数据能够保存在.json文件中,通常里面就只有一个json对象。
总结:
1. json文件的后缀是.json 2. json文件通常保存一个单一的json数据 3. json数据的属性不能是方法或者undefined,属性值只能:数值、字符串、json和数组 4. json数据只使用双引号、每个属性成员之间使用逗号隔开,而且最后一个成员没有逗号。 { "name":"小明", "age":200, "fav":["code","eat","swim","read"], "son":{ "name":"小小明", "age":100 } }
工具:postman能够用于测试开发的数据接口。
javascript提供了一个JSON对象来操做json数据的数据转换.
方法 | 参数 | 返回值 | 描述 |
---|---|---|---|
stringify | json对象 | 字符串 | json对象转成字符串 |
parse | 字符串 | json对象 | 字符串格式的json数据转成json对象 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <script> // json语法 let humen = { "username":"xiaohui", "password":"1234567", "age":20 }; console.log(humen); console.log(typeof humen); // JSON对象提供对json格式数据的转换功能 // stringify(json对象) # 用于把json转换成字符串 let result = JSON.stringify(humen); console.log(result); console.log(typeof result); // parse(字符串类型的json数据) # 用于把字符串转成json对象 let json_str = '{"password":"1123","age":20,"name":"xiaobai"}'; console.log(json_str) console.log(typeof json_str) let json_obj = JSON.parse(json_str); console.log(json_obj); console.log(typeof json_obj) console.log(json_obj.age) </script> </body> </html>
ajax,通常中文称之为:"阿贾克斯",是英文 “Async Javascript And Xml”的简写,译做:异步js和xml数据传输数据。
ajax的做用: ajax可让js代替浏览器向后端程序发送http请求,与后端通讯,在用户不知道的状况下操做数据和信息,从而实现页面局部刷新数据/无刷新更新数据。
因此开发中ajax是很经常使用的技术,主要用于操做后端提供的数据接口
,从而实现网站的先后端分离
。
ajax技术的原理是实例化js的XMLHttpRequest对象,使用此对象提供的内置方法就能够与后端进行数据通讯。
数据接口,也叫api接口,表示后端提供
操做数据/功能的url地址给客户端使用。
客户端经过发起请求向服务端提供的url地址申请操做数据【操做通常:增删查改】
同时在工做中,大部分数据接口都不是手写,而是经过函数库/框架来生成。
ajax的使用必须与服务端程序配合使用,可是目前咱们先学习ajax的使用,因此暂时先不涉及到服务端python代码的编写。所以,咱们可使用别人写好的数据接口进行调用。
jQuery将ajax封装成了一个函数$.ajax(),咱们能够直接用这个函数来执行ajax请求。
编写代码获取接口提供的数据:
jQ版本
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/jquery-1.12.4.js"></script> <script> $(function(){ $("#btn").on("click",function(){ $.ajax({ // 后端程序的url地址 url: 'http://wthrcdn.etouch.cn/weather_mini', // 也可使用method,提交数据的方式,默认是'GET',经常使用的还有'POST' type: 'get', dataType: 'json', // 返回的数据格式,经常使用的有是'json','html',"jsonp" data:{ // 设置发送给服务器的数据,若是是get请求,也能够写在url地址的?后面 "city":'北京' } }) .done(function(resp) { // 请求成功之后的操做,新的ajax是这样写的,以前是经过属性success:function(){}的形式来写的 console.log(resp); }) .fail(function(error) { // 请求失败之后的操做 console.log(error); }); }); }) </script> </head> <body> <button id="btn">点击获取数据</button> </body> </html>
vue版本:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/vue.js"></script> <script src="js/axios.js"></script> </head> <body> <div id="app"> <input type="text" v-model="city"> <button @click="get_weather">点击获取天气</button> </div> <script> let vm = new Vue({ el:"#app", data:{ city:"", }, methods:{ get_weather(){ // http://wthrcdn.etouch.cn/weather_mini?city=城市名称 axios.get("http://wthrcdn.etouch.cn/weather_mini?city="+this.city) .then(response=>{ console.log(response); }).catch(error=>{ console.log(error.response) }); } } }) </script> </body> </html>
总结:
1. 发送ajax请求,要经过$.ajax(),参数是对象,里面有固定的参数名称。 $.ajax({ "url":"数据接口url地址", "method":"http请求方式,前端只支持get和post", "dataType":"设置服务器返回的数据格式,经常使用的json,html,jsonp,默认值就是json", // 要发送给后端的数据参数,post时,数据必须写在data,get能够写在data,也能够跟在地址栏?号后面 "data":{ "数据名称":"数据值", } }).then(function(resp){ // ajax请求数据成功时会自动调用then方法的匿名函数 console.log( resp ); // 服务端返回的数据 }).fail(function(error){ // ajax请求数据失败时会自动调用fail方法的匿名函数 console.log( error ); }); 2. ajax的使用每每配合事件/钩子操做进行调用。
jQuery还提供了$.get 和 $post简写$.ajax的操做。
// 发送get请求 // 参数1:数据接口的请求地址 // 参数2:发送给接口地址的数据参数 // 参数3:ajax请求成功之后,调用的匿名函数,匿名函数的第一个参数仍是服务端返回的数据 // 参数4:设置服务端返回的数据格式,告诉给jQuery $.get("test.php", { "func": "getNameAndTime" }, function(data){ alert(data.name); // John console.log(data.time); // 2pm }, "json"); // 发送post请求 // 参数1:数据接口的请求地址 // 参数2:发送给接口地址的数据参数 // 参数3:ajax请求成功之后,调用的匿名函数,匿名函数的第一个参数仍是服务端返回的数据 // 参数4:设置服务端返回的数据格式,告诉给jQuery $.post("test.php", { "func": "getNameAndTime" }, function(data){ alert(data.name); // John console.log(data.time); // 2pm }, "json");
同源策略,是浏览器为了保护用户信息安全的一种安全机制。所谓的同源就是指代通讯的两个地址(例如服务端接口地址与浏览器客户端页面地址)之间比较,是否协议、域名(IP)和端口相同。不一样源的客户端脚本[javascript]在没有明确受权的状况下,没有权限读写对方信息。
ajax本质上仍是javascript,是运行在浏览器中的脚本语言,因此会被受到浏览器的同源策略所限制。
前端地址:http://www.oldboy.cn/index.html |
是否同源 | 缘由 |
---|---|---|
http://www.oldboy.cn/user/login.html |
是 | 协议、域名、端口相同 |
http://www.oldboy.cn/about.html |
是 | 协议、域名、端口相同 |
https://www.oldboy.cn/user/login.html |
否 | 协议不一样 ( https和http ) |
http:/www.oldboy.cn:5000/user/login.html |
否 | 端口 不一样( 5000和80) |
http://bbs.oldboy.cn/user/login.html |
否 | 域名不一样 ( bbs和www ) |
同源策略针对ajax的拦截,代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/vue.js"></script> <script src="js/axios.js"></script> </head> <body> <div id="app"> <button @click="get_music">点击获取天气</button> </div> <script> let vm = new Vue({ el:"#app", data:{}, methods:{ get_music(){ axios.get("http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.search.catalogSug&query=个人中国心") .then(response=>{ console.log(response); }).catch(error=>{ console.log(error.response) }); } } }) </script> </body> </html>
上面代码运行错误以下:
Access to XMLHttpRequest at 'http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.search.catalogSug&query=%E6%88%91%E7%9A%84%E4%B8%AD%E5%9B%BD%E5%BF%83' from origin 'http://localhost:63342' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
上面错误,关键词:Access-Control-Allow-Origin
只要出现这个关键词,就是访问受限。出现同源策略的拦截问题。
CORS是一个W3C标准,全称是"跨域资源共享",它容许浏览器向跨源的后端服务器发出ajax请求,从而克服了AJAX只能同源使用的限制。
实现CORS主要依靠后端服务器中响应数据中设置响应头信息返回的。
django的视图
def post(request):
response = new Response()
response .set_header("Access-Control-Allow-Origin","*")
return response;
// 在响应行信息里面设置如下内容: Access-Control-Allow-Origin: ajax所在的域名地址 Access-Control-Allow-Origin: www.oldboy.cn # 表示只容许www.oldboy.cn域名的客户端的ajax跨域访问 // * 表示任意源,表示容许任意源下的客户端的ajax均可以访问当前服务端信息 Access-Control-Allow-Origin: *
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n9gXRZUz-1589445120083)(assets/1556074087897.png)]
总结:
0. 同源策略:浏览器的一种保护用户数据的一种安全机制。 浏览器会限制脚本语法不能跨源访问其余源的数据地址。 同源:判断两个通讯的地址之间,是否协议,域名[IP],端口一致。 ajax: http://127.0.0.1/index.html api数据接口: http://localhost/index 这两个是同源么?不是同源的。是否同源的判断依据不会根据电脑来判断,而是经过协议、域名、端口的字符串是否来判断。 1. ajax默认状况下会受到同源策略的影响,一旦受到影响会报错误以下: No 'Access-Control-Allow-Origin' header is present on the requested resource 2. 解决ajax只能同源访问数据接口的方式: 1. 在服务端的响应行中设置: Access-Control-Allow-Origin: 容许访问的域名地址 2. jsonp 3. 是否服务端代理 思路:经过python来请求对应的服务器接口,获取到数据之后,
组件(Component)是自定义封装的功能。在前端开发过程当中,常常出现多个网页的功能是重复的,并且不少不一样的网站之间,也存在一样的功能。
而在网页中实现一个功能,须要使用html定义功能的内容结构,使用css声明功能的外观样式,还要使用js来定义功能的特效,所以就产生了把一个功能相关的[HTML、css和javascript]代码封装在一块儿组成一个总体的代码块封装模式,咱们称之为“组件”。
因此,组件就是一个html网页中的功能,通常就是一个标签,标签中有本身的html内容结构,css样式和js特效。
这样,前端人员就能够在开发时,只须要书写一次代码,随处引入便可使用。
咱们在进行vue开发的时候,还记得咱们本身建立的vm对象吗,这个vm对象咱们称为一个大组件,根组件(页面上叫Root),在一个网页的开发中,根据网页上的功能区域咱们又能够细分红其余组件,或称为子组件
组件有两种:默认组件[全局组件] 和 单文件组件[局部组件]
三步:声子、用子、挂子
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script src="vue.js"></script> </head> <body> <div id="app"> <div class="vheader"> 这是头部{{msg}} </div> <App/> <!--3 使用子组件--> </div> </body> <script> //子组件的名称尽可能不要叫作Header或者vHeader等,以防和最新的H5中的标签名称冲突,致使组件没法使用 // 1 声明子组件 let App = { data(){ return { 'appmsg':'hello app!' } }, template:` <div class="content"> 内容部分{{appmsg}} </div> ` }; let vm = new Vue({ el:'#app', data(){ return { 'msg':'hello' } }, components:{ App, // 2 挂载子组件 } // template:` // <div class="vheader"> // 这是头部 // </div> // // ` }) </script> </html>
直接看代码,局部组件使用时须要挂载,全局组件使用时不须要挂载。那么他们两个何时用呢,局部组件就在某个局部使用的时候,全局组件是你们公用的,或者说每一个页面都有这么一个功能的时候,在哪里可能都会用到的时候。
<div id="app"> <addnum></addnum> </div> <script> Vue.component("addnum",{ template:'<div><input type="text" v-model="num"><button @click="num+=1">点击</button></div>', data: function(){ // 写在这里的数据只有当前组件可使用 return { num:1, } } }); var vm = new Vue({ el:"#app", data:{ } }) </script>
经过prop属性进行传值
两步:
1.在子组件中使用props属性声明,而后能够直接在子组件中任意使用
2.父组件要定义自定义的属性
看示例:
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script src="vue.js"></script> </head> <body> <div id="app"> <div class="vheader"> 这是头部{{msg}} </div> <App :xx="msg"/> </div> </body> <script> let App = { data(){ return { 'appmsg':'hello app!' } }, template:` <div class="content"> 内容部分{{appmsg}}--{{xx}} </div> `, props:['xx',] }; let vm = new Vue({ el:'#app', data(){ return { 'msg':'hello' } }, components:{ App, } }) </script> </html>
使用父组件传递数据给子组件时, 注意一下几点:
传递数据是变量,则须要在属性左边添加冒号.
传递数据是变量,这种数据称之为"动态数据传递"
传递数据不是变量,这种数据称之为"静态数据传递"
父组件中修改了数据,在子组件中会被同步修改,可是,子组件中的数据修改了,是否是影响到父组件中的数据.
这种状况,在开发时,也被称为"单向数据流"
两步:
a.子组件中使用this.$emit('fatherHandler',val);fatherHandler是父组件中使用子组件的地方添加的绑定自定义事件,注意,若是fatherHandler报错了,那么多是你的vue版本不支持自定义键名称fatherHandler中有大写字母,因此咱们改为father-handler或者直接就所有小写就能够了
<Vheader @fatherHandler="appFatherHandler"></Vheader>
b.父组件中的methods中写一个自定义的事件函数:appFatherHandler(val){},在函数里面使用这个val,这个val就是上面子组件传过来的数据
看代码:
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script src="vue.js"></script> </head> <body> <div id="app"> <div class="vheader"> 这是头部{{msg}} -- {{sondata}} </div> <App @son="sonDataHandler"/> </div> </body> <script> let App = { data(){ return { 'appmsg':'hello app!' } }, template:` <div class="content"> 内容部分{{appmsg}} <button @click="xH"></button> </div> `, methods:{ xH(){ this.$emit('son',this.appmsg) } } }; let vm = new Vue({ el:'#app', data(){ return { 'msg':'hello', 'sondata':'xxx', } }, components:{ App, }, methods:{ sonDataHandler(val){ console.log(val); this.sondata = val; } } }) </script> </html>
什么是平行组件,看图
看代码 :声明两个全局组件T1和T2,T1组件将数据传送给T2组件
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script src="vue.js"></script> </head> <body> <div id="app"> <div class="vheader"> 这是头部{{msg}} -- {{sondata}} </div> <!--<App :xx="msg"/>--> <App @sonHa="sonDataHandler"/> </div> </body> <script> let bus = new Vue(); Vue.component('T1',{ data(){ return { 't1num':100, } }, template:` <div class="t1"> {{t1num}} <button @click="f1">走你</button> </div> `, methods:{ f1(){ // console.log(this.t1num); bus.$emit('TestData',this.t1num) } } }); Vue.component('T2',{ data(){ return { 't2num':200, 't1n':0, } }, template:` <div class="t2"> <h1>{{t2num}}</h1> <h2 style="color:red;">{{t1n}}</h2> </div> `, created(){ // console.log(this.t1n); bus.$on('TestData',(val)=>{ console.log(val); this.t1n = val; }) } }); let App = { data(){ return { 'appmsg':'hello app!' } }, template:` <div class="content"> 内容部分{{appmsg}} <button @click="xH">点击</button> <T1></T1> <T2></T2> </div> `, methods:{ xH(){ this.$emit('sonHa',this.appmsg) } // console.log(this); } // props:['xx',] }; let vm = new Vue({ el:'#app', data(){ return { 'msg':'hello', 'sondata':'xxx', } }, components:{ App, }, methods:{ sonDataHandler(val){ console.log(val); this.sondata = val; } } }) </script> </html>
vue就是咱们前面学习的vue基础,vue + vue-router 主要用来作SPA(Single Page Application),单页面应用
为何要使用单页面应用呢?由于传统的路由跳转,若是后端资源过多,会致使页面出现'白屏现象',因此咱们但愿让前端来作路由,在某个生命周期的钩子函数中,发送ajax来请求数据,进行数据驱动,以前好比咱们用django的MTV模式,咱们是将后端的数据所有渲染给了模板,而后模板再发送给前端进行浏览器页面的渲染,一下将全部的数据都给了页面,而咱们如今使用vue,我能够在组件的钩子函数中发送对应的ajax请求去获取对应的数据,而不是裤衩一会儿就把数据都放到页面上了,单页面应用给咱们提供了不少的便利,提及来你们可能没有什么切实的体会,来,给你们推荐一个稀土掘金网站,这个网站就是一个单页面应用,是一个开发者技术社区网站,里面的资源会有不少,看样子:
这样的网站咱们经过django是能够来完成页面的渲染的,模板渲染嘛,可是这个论坛的数据资源有不少,咱们经过django的MTV模式是一会儿就将数据所有放到页面里面了,那么页面经过浏览器渲染的时候,浏览器可能没有那么快渲染出来,会出现几秒钟的白屏现象,也就是说几秒钟以后用户才看到页面的内容,这样体验起来就很差,为了用户体验好,就用到了咱们说的单页面应用,django模板渲染作大型应用的时候,也就是页面很复杂,数据量很大的页面的时候,是不太合适的,固然若是你够nb,你也能够优化,可是通常它比较适合一些页面数据比较小的应用。
那么解释一下什么是单页应用,看下图:(react、angular也都是作单页面应用,不少大型的网站像网易云音乐,豆瓣等都是react写的单页面应用)
vue + vue-router就是完成单页面应用的,vue-router(路由)是vue的核心插件
下面咱们来下载一下vue-router,文档地址,下载vue-router的cnd连接地址:https://unpkg.com/vue-router/dist/vue-router.js
官网简单操做:
// 0. 若是使用模块化机制编程,导入Vue和VueRouter,要调用 Vue.use(VueRouter) // 1. 定义 (路由) 组件。 // 下面两个组件能够从其余文件 import 进来 const Foo = { template: '<div>foo</div>' } const Bar = { template: '<div>bar</div>' } // 2. 定义路由 // 每一个路由应该映射一个组件。 其中"component" 能够是 // 经过 Vue.extend() 建立的组件构造器, // 或者,只是一个组件配置对象。 // 咱们晚点再讨论嵌套路由。 const routes = [ { path: '/foo', component: Foo }, { path: '/bar', component: Bar } ] // 3. 建立 router 实例,而后传 `routes` 配置 // 你还能够传别的配置参数, 不过先这么简单着吧。 const router = new VueRouter({ routes // (缩写) 至关于 routes: routes }) // 4. 建立和挂载根实例。 // 记得要经过 router 配置参数注入路由, // 从而让整个应用都有路由功能 const app = new Vue({ router }).$mount('#app') // 如今,应用已经启动了!
示例: 经过不一样的路径访问到不一样的组件
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <div id="app"> <App></App> </div> </body> <script src="js/vue.js"></script> <!--<script src="js/vue-router.js"></script>--> <!-- 注意:测试的时候可能由于你的vue或者vue-router文件有些版本上的冲突问题,致使router-link不能生成a标签,全部建议用下面这两个进行测试,而后再找对应的版本存到本地 --> <script src="https://unpkg.com/vue/dist/vue.js"></script> <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script> <script> // import VueRouter from 'node_modules/vue-router/dist/vue-router' Vue.use(VueRouter); let Home = { data(){ return { 'msg':'hello home', } }, template:` <div class="home"> {{msg}} </div> ` }; let Course = { data(){ return { 'msg':'hello course', } }, template:` <div class="course"> {{msg}} </div> ` }; let App = { data(){ return {} }, template:` <div> <router-link to="/home">首页</router-link> <router-link to="/course">课程详情页</router-link> <router-view></router-view> </div> ` }; let router = new VueRouter({ // mode:'history', routes:[ // {path:'/',redirect}, {path:'/home',component:Home}, {path:'/course',component:Course}, ] }); let vm = new Vue({ el:'#app', router, data(){ return { } }, // template:`<App></App>`, components:{ App, } }) </script> </html>
前面学习了普通组件之后,接下来咱们继续学习单文件组件则须要提早先安装准备一些组件开发工具。不然没法使用和学习单文件组件。
通常状况下,单文件组件,咱们运行在 自动化工具vue-CLI中,能够帮咱们编译单文件组件。因此咱们须要在系统中先搭建vue-CLI工具,
Vue CLI 须要 Node.js 8.9 或更高版本 (推荐 8.11.0+)。你可使用 nvm 或 nvm-windows在同一台电脑中管理多个 Node 版本。
nvm工具的下载和安装: https://www.jianshu.com/p/d0e0935b150a
https://www.jianshu.com/p/622ad36ee020
安装记录:
打开:https://github.com/coreybutler/nvm-windows/releases
经常使用的nvm命令
nvm list # 列出目前在nvm里面安装的全部node版本
nvm install node版本号 # 安装指定版本的node.js
例子:nvm install 12.13.1
nvm uninstall node版本号 # 卸载指定版本的node.js
nvm use node版本号 # 切换当前使用的node.js版本
若是使用nvm工具,则直接能够不用本身手动下载,若是使用nvm下载安装 node的npm比较慢的时候,能够修改nvm的配置文件(在安装根目录下)
# settings.txt root: C:\tool\nvm [这里的目录地址是安装nvm时本身设置的地址,要根据实际修改] path: C:\tool\nodejs arch: 64 proxy: none node_mirror: http://npm.taobao.org/mirrors/node/ npm_mirror: https://npm.taobao.org/mirrors/npm/
Node.js是一个新的后端(后台)语言,它的语法和JavaScript相似,因此能够说它是属于前端的后端语言,后端语言和前端语言的区别:
咱们通常安装LTS(长线支持版本):
下载地址:https://nodejs.org/en/download/【上面已经安装了nvm,那么这里不用手动安装了】
node.js的版本有两大分支:
官方发布的node.js版本:0.xx.xx 这种版本号就是官方发布的版本
社区发布的node.js版本:xx.xx.x 就是社区开发的版本
Node.js若是安装成功,能够查看Node.js的版本,在终端输入以下命令:
node -v
在安装node.js完成后,在node.js中会同时帮咱们安装一个npm包管理器npm。咱们能够借助npm命令来安装node.js的包。这个工具至关于python的pip管理器。
npm install -g 包名 # 安装模块 -g表示全局安装,若是没有-g,则表示在当前项目安装 npm list # 查看当前目录下已安装的node包 npm view 包名 engines # 查看包所依赖的Node的版本 npm outdated # 检查包是否已通过时,命令会列出全部已过期的包 npm update 包名 # 更新node包 npm uninstall 包名 # 卸载node包 npm 命令 -h # 查看指定命令的帮助文档
npm install -g vue-cli npm install -g vue-cli --registry https://registry.npm.taobao.org
若是安装速度过慢,一直超时,能够考虑切换npm镜像源:http://npm.taobao.org/
指令:
1 //临时使用 2 npm install jquery --registry https://registry.npm.taobao.org 3 4 //能够把这个选型配置到文件中,这样不用每一次都很麻烦 5 npm config set registry https://registry.npm.taobao.org 6 7 //验证是否配置成功 8 npm config list 或者 npm config get registry 9 10 //在任意目录下均可执行,--global是全局安装,不可省略 11 npm install --global cnpm 或者 npm install -g cnpm --registry=https://registry.npm.taobao.org 12 13 //安装后直接使用 14 cnpm install jquery
npm和cnpm介绍
参考博客: http://www.javashuo.com/article/p-vsseezil-kx.html
安装vue-cli
nvm是node.js的版本管理工具
1 安装node.js 自带npm
2 经过npm 安装vue-cli 它的运行须要依赖node.js的环境
使用vue自动化工具能够快速搭建单页应用项目目录。
该工具为现代化的前端开发工做流提供了开箱即用的构建配置。只需几分钟便可建立并启动一个带热重载、保存时静态检查以及可用于生产环境的构建配置的项目:
// 生成一个基于 webpack 模板的新项目 vue init webpack 项目名 例如: vue init webpack myproject // 启动开发服务器 ctrl+c 中止服务 cd myproject npm run dev # 运行这个命令就能够启动node提供的测试http服务器
那么访问一下命令执行完成后提示出来的网址就能够看到网站了:http://localhost:8080/
src 主开发目录,要开发的单文件组件所有在这个目录下的components目录下
static 静态资源目录,全部的css,js,图片等文件放在这个文件夹
dist项目打包发布文件夹,最后要上线单文件项目文件都在这个文件夹中[后面打包项目,让项目中的vue组件通过编译变成js 代码之后,dist就出现了]
node_modules目录是node的包目录,
config是配置目录,
build是项目打包时依赖的目录
src/router 路由,后面须要咱们在使用Router路由的时候,本身声明.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hCgyICQi-1589445120203)(vue-2.assets/image-20200114174249570.png)]
整个项目是一个主文件index.html,index.html中会引入src文件夹中的main.js,main.js中会导入顶级单文件组件App.vue,App.vue中会经过组件嵌套或者路由来引用components文件夹中的其余单文件组件。
组件有两种:普通组件、单文件组件
普通组件的缺点:
将一个组件相关的html结构,css样式,以及交互的JavaScript代码从html文件中剥离出来,合成一个文件,这种文件就是单文件组件,至关于一个组件具备告终构、表现和行为的完整功能,方便组件之间随意组合以及组件的重用,这种文件的扩展名为“.vue”,好比:"Home.vue"。
若是使用的是PyCharm这个IDE,须要咱们自行下载vue的插件,在配置中找到plugins,而后搜索vue.js,点击下载,下载完成以后重启PyCharm就能够了
在组件中编辑三个标签,编写视图、vm对象和css样式代码。
template 编写html代码的地方
<template> <div id="Home"> <span @click="num--" class="sub">-</span> <input type="text" size="1" v-model="num"> <span @click="num++" class="add">+</span> </div> </template>
script编写vue.js代码
<script> export default { name:"Home", data: function(){ return { num:0, } } } </script>
style编写当前组件的样式代码
<style scoped> .sub,.add{ border: 1px solid red; padding: 4px 7px; } </style>
建立Homes.vue
<template> <div id="Home"> <span @click="num--" class="sub">-</span> <input type="text" size="1" v-model="num"> <span @click="num++" class="add">+</span> </div> </template> <script> export default { name:"Home", data: function(){ return { num:0, } } } </script> <style scoped> .sub,.add{ border: 1px solid red; padding: 4px 7px; } </style>
在App.vue组件中调用上面的组件
<template> <div id="Home"> <span @click="num--" class="sub">-</span> <input type="text" size="1" v-model="num"> <span @click="num++" class="add">+</span> </div> </template> <script> export default { name:"Home", data: function(){ return { num:0, } } } </script> <style scoped> .sub,.add{ border: 1px solid red; padding: 4px 7px; } </style>
在开发vue项目以前,须要手动把 App.vue的HelloWorld组件代码以及默认的css样式,清楚。
有时候开发vue项目时,页面也能够算是一个大组件,同时页面也能够分红多个子组件.
由于,产生了父组件调用子组件的状况.
例如,咱们能够声明一个组件,做为父组件
在components/建立一个保存子组件的目录HomeSon
在HomeSon目录下,能够建立当前页面的子组件,例如,是Menu.vue
// 组件中代码必须写在同一个标签中 <template> <div id="menu"> <span>{{msg}}</span> <div>hello</div> </div> </template> <script> export default { name:"Menu", data: function(){ return { msg:"这是Menu组件里面的菜单", } } } </script>
默认状况下,咱们的项目中并无对axios包的支持,因此咱们须要下载安装。
在项目根目录中使用 npm安装包
npm install axios
接着在main.js文件中,导入axios并把axios对象 挂载到vue属性中多为一个子对象,这样咱们才能在组件中使用。
// The Vue build version to load with the `import` command // (runtime-only or standalone) has been set in webpack.base.conf with an alias. import Vue from 'vue' import App from './App' // 这里表示从别的目录下导入 单文件组件 import axios from 'axios'; // 从node_modules目录中导入包 Vue.config.productionTip = false Vue.prototype.$axios = axios; // 把对象挂载vue中 /* eslint-disable no-new */ new Vue({ el: '#app', components: { App }, template: '<App/>' });
<script> export default{ 。。。 methods:{ get_data:function(){ // 使用axios请求数据 this.$axios.get("http://wthrcdn.etouch.cn/weather_mini?city=深圳").then((response)=>{ console.log(response); }).catch(error=>{ console.log(error); }) } } } </script>
使用的时候,由于本质上来讲,咱们仍是原来的ajax,因此也会收到同源策略的影响。