Vue使用AES加密
前言
这里主要用语对登录帐号的加密
Vue.js 模板语法
Vue.js 使用了基于 HTML 的模版语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。
Vue.js 的核心是一个允许你采用简洁的模板语法来声明式的将数据渲染进 DOM 的系统。
结合响应系统,在应用状态改变时, Vue 能够智能地计算出重新渲染组件的最小代价并应用到 DOM 操作上。
插值
文本
数据绑定最常见的形式就是使用
1 | {{...}} |
(双大括号)的文本插值:
打开 index.html
1 | <div id="app"></div> |
打开 src/main.js
,这里面放的是当前router
写js
脚本的地方。
1 | // 在最后添加 ,因为最上面已经添加了 import Vue from 'vue' 所以就可以直接用了 |
保存之后刷新页面(如果是按照我的安装,则自动添加热加载);
Html
使用 v-html 指令用于输出 html 代码:
打开 index.html
1 | <div id="app"></div> |
打开 src/main.js
1 | new Vue({ |
自己测试前段界面哦。
属性
HTML 属性中的值应使用 v-bind 指令。
以下实例判断 class1 的值,如果为 true 使用 class1 类的样式,否则不使用该类:
v-bind 指令
打开 index.html
1 |
|
打开 src/main.js
在 data
中添加,use: false
;
表达式
Vue.js 都提供了完全的 JavaScript 表达式支持。
打开 index.html
1 | <!-- ** --> |
打开 src/main.js
在 data
中添加
1 | use: false, |
指令
指令是带有 v- 前缀的特殊属性。
指令用于在表达式的值改变时,将某些行为应用到 DOM 上。如下例子:
v-if
打开 index.html
,接着添加:
1 | <br> |
打开 src/main.js
在 data
中添加
1 | seen: true |
这里, v-if 指令将根据表达式 seen 的值(true 或 false )来决定是否插入 p 元素。
参数
参数在指令后以冒号指明。例如, v-bind 指令被用来响应地更新 HTML 属性:
打开 index.html
,接着添加:
1 | <br> |
打开 src/main.js
在 data
中添加
1 | url: 'http://localhost:8080' |
在这里 href 是参数,告知 v-bind 指令将该元素的 href 属性与表达式 url 的值绑定。
另一个例子是 v-on 指令,它用于监听 DOM 事件:
打开 index.html
,接着添加:
1 | <pre><a v-on:click="alertMsg">弹出警示</a></pre> |
打开 src/main.js
在 methods
中添加
1 | methods: { |
在这里参数是监听的事件名。
修饰符
修饰符是以半角句号.
指明的特殊后缀,用于指出一个指令应该以特殊方式绑定。例如,.prevent
修饰符告诉 v-on
指令对于触发的事件调用 event.preventDefault()
:
1 | <form v-on:submit.prevent="onSubmit"></form> |
用户输入
在 input 输入框中我们可以使用 v-model 指令来实现双向数据绑定:
双向数据绑定
打开 index.html
,接着添加:
1 | <p>{{ message }}</p> |
v-model 指令用来在 input、select、textarea、checkbox、radio 等表单控件元素上创建双向数据绑定,根据表单上的值,自动更新绑定的元素的值。
按钮的事件我们可以使用 v-on 监听事件,并对用户的输入进行响应。
以下实例在用户点击按钮后对字符串进行反转操作:
字符串反转
打开 index.html
,接着添加:
1 | <p>{{ message }}</p> |
在main.js
中的 methods
中添加
1 | reverseMessage: function () { |
现在大家已经可以知道数据和方法的“存放处”了,接下来就不在详细叙述了,只是走流程。
过滤器
Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化。由”管道符”指示, 格式如下:
1 | <h1>{{ message | reverseMessage }}</h1> |
过滤器函数接受表达式的值作为第一个参数。
以下实例对输入的字符串第一个字母反转
1 | // 与methods同级别添加filters属性 |
过滤器可以串联:
1 | <h1>{{ message |reverseMessage | capitalize }}</h1> |
过滤器是 JavaScript 函数,因此可以接受参数:
1 | <h1>{{ message |reverseMessage | capitalize | addStr('--maxzhao--') }}</h1> |
1 | addStr: function (value, addStr) { |
这里,message 是第一个参数,字符串 ‘arg1’ 将传给过滤器作为第二个参数, arg2 表达式的值将被求值然后传给过滤器作为第三个参数。
缩写
v-bind 缩写
Vue.js 为两个最为常用的指令提供了特别的缩写:
1 | <!-- 完整语法 --> <a v-bind:href="url"></a> |
v-on 缩写
1 | <a v-on:click="doSomething"></a> |
起步结束了,下面开始一些有难度的操作(学过之后简直毫无难度)。
Vue.js 条件与循环
条件判断
v-if 指令
条件判断使用 v-if 指令:
在元素 和 template 中使用 v-if 指令:
1 | <template v-if="ok"> |
这里, v-if
指令将根据表达式 ok
的值(true 或 false )来决定是否插入template
元素。
在字符串模板中,如 Handlebars ,我们得像这样写一个条件块:
1 | <!-- Handlebars 模板,暂时还不知道有啥用 --> |
v-else 指令
可以用 v-else 指令给 v-if 添加一个 “else” 块:
随机生成一个数字,判断是否大于0.5,然后输出对应信息:
1 | <div v-if="Math.random() > 0.5"> |
v-else-if 指令
v-else-if 在 2.1.0 新增,顾名思义,用作 v-if 的 else-if 块。可以链式的多次使用:
判断 type 变量的值:
1 | <div v-if="type === 'A'"> |
1 | data: { |
v-else 、v-else-if 必须跟在 v-if 或者 v-else-if之后。
v-show 指令
我们也可以使用 v-show 指令来根据条件展示元素:
1 | <h1 v-show="true">Hello!</h1> |
Vue.js 循环语句
v-for 指令
循环使用 v-for 指令。
v-for 指令需要以 site in sites 形式的特殊语法, sites 是源数据数组并且 site 是数组元素迭代的别名。
v-for 可以绑定数据到数组来渲染一个列表:
1 | <ol> |
1 | data: { |
模板中使用 v-for:
v-for 迭代对象
v-for 可以通过一个对象的属性来迭代数据:
1 | <ul> |
1 | data: { |
第二个的参数为键名:
1 | <ul> |
第三个参数为索引:
1 | <ul> |
v-for 迭代整数
v-for 也可以循环整数
1 | <ul> |
v-for指令界面效果
Vue.js 计算属性
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
1 | <div> |
1 | computed: { |
实例中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。
computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。
computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
1 | var vm = new Vue({ |
引:
1 | // 把代码改了改,应该可以体现 computer 属性“依赖缓存”的概念以及与 method 的差别。如下面代码,cnt 是独立于 vm 对象的变量。在使用 reversedMessage 这个计算属性的时候,第一次会执行代码,得到一个值,以后再使用 reversedMessage 这个计算属性,因为 vm 对象没有发生改变,于是界面渲染就直接用这个值,不再重复执行代码。而 reversedMessage2 没有这个缓存,只要用一次,函数代码就执行一次,于是每次返回值都不一样。 |
Vue.js 监听属性
本章节,我们将为大家介绍 Vue.js 监听属性 watch,我们可以通过 watch 来响应数据的变化。
以下实例通过使用 watch 实现计数器:
1 | <div> |
1 | var vm = new Vue({ |
千米和米的换算
1 | <br> |
1 | data: { |
控制台为什么会打印两次呢?因为kilometers
改变执行一次,并且改变了 meters
,所以执行的meters
改变(又改变了kilometers
),所以又打印了一次,但因为 meters
在此时并没有改变,所以没有后续触发。
Vue.js 样式绑定
Vue.js class
class 与 style 是 HTML 元素的属性,用于设置元素的样式,我们可以用 v-bind 来设置样式属性。
Vue.js v-bind 在处理 class 和 style 时, 专门增强了它。表达式的结果类型除了字符串之外,还可以是对象或数组。
class 属性绑定
我们可以为 v-bind:class 设置一个对象,从而动态的切换 class:
1 | <head> |
1 | data: { |
Vue.js style(内联样式)
这里的所有操作就不写在 js 中了,表达式等都是可以直接写在页面上的。
1 | <br> |
Vue.js 事件处理器
v-on
事件监听可以使用 v-on 指令。
通常情况下,我们需要使用一个方法来调用 JavaScript 方法。
v-on 可以接收一个定义的方法来调用。
1 | <br> |
js 中添加
1 | methods: { |
事件修饰符
Vue.js 为 v-on 提供了事件修饰符来处理 DOM 事件细节,如:event.preventDefault() 或 event.stopPropagation()。
Vue.js通过由点(.)表示的指令后缀来调用修饰符。
.stop
.prevent
.capture
.self
.once
1 | <br> |
按键修饰符
1 | // 需要js methods |
Vue 允许为 v-on 在监听键盘事件时添加按键修饰符:
1 | <!-- 只有在 keyCode 是 13 时调用 vm.submit() --> |
记住所有的 keyCode 比较困难,所以 Vue 为最常用的按键提供了别名:
1 | <!-- 同上 --> |
全部的按键别名:
.enter
.tab
.delete
(捕获 “删除” 和 “退格” 键).esc
.space
.up
.down
.left
.right
.ctrl
.alt
.shift
.meta
Vue.js 表单
可以用 v-model 指令在表单控件元素上创建双向数据绑定。
v-model 会根据控件类型自动选取正确的方法来更新元素。\
常规表单
1 | <p>input 元素:</p> |
1 | checked : false, |
修饰符
.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:
1 | <!-- 在 "change" 而不是 "input" 事件中更新 --> |
.number
如果想自动将用户的输入值转为 Number 类型(如果原值的转换结果为 NaN 则返回原值),可以添加一个修饰符 number 给 v-model 来处理输入值:
1 | <input v-model.number="age" type="number"> |
这通常很有用,因为在 type=”number” 时 HTML 中输入的值也总是会返回字符串类型。
.trim
如果要自动过滤用户输入的首尾空格,可以添加 trim 修饰符到 v-model 上过滤输入:
1 | <input v-model.trim="msg"> |
Vue.js 组件component
组件(Component)是 Vue.js 最强大的功能之一。
组件可以扩展 HTML 元素,封装可重用的代码。
组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象为一个组件树:
全局组件
注册一个全局组件语法格式如下:
1 | Vue.component(tagName, options) |
tagName 为组件名,options 为配置选项。注册后,我们可以使用以下方式来调用组件:
1 | <tagName></tagName> |
实例
1 |
|
局部组件
我们也可以在实例选项中注册局部组件,这样组件只能在这个实例中使用:
1 | <div id="vue_det"> |
1 | // 注册 |
Prop
prop 是父组件用来传递数据的一个自定义属性。
父组件的数据需要通过 props 把数据传给子组件,子组件需要显式地用 props 选项声明 “prop”:
1 | <maxzhao_all message1="hello!"></maxzhao_all> |
1 | // 注册 |
首次接触可能会很难理解,其实很简单,就像<div class="class1" ></div>
一样,为当前的div
的 class
的传递一个 class1
的参数。
动态 Prop
1 | <maxzhao_all v-bind:message1="author"></maxzhao_all><maxzhao_all :message1="author"></maxzhao_all> |
1 | data: { |
Prop 实例
1 | // 当前列表中的一条记录 |
1 | <ol> |
Prop 验证
1 | Vue.component('example', { |
type 可以是下面原生构造器:
- String
- Number
- Boolean
- Function
- Object
- Array
type 也可以是一个自定义构造器,使用 instanceof 检测。
自定义事件
父组件是使用 props 传递数据给子组件,但如果子组件要把数据传递回去,就需要使用自定义事件!
我们可以使用 v-on 绑定自定义事件, 每个 Vue 实例都实现了事件接口(Events interface),即:
- 使用
$on(eventName)
监听事件 - 使用
$emit(eventName)
触发事件
另外,父组件可以在使用子组件的地方直接用 v-on 来监听子组件触发的事件。
以下实例中子组件已经和它外部完全解耦了。它所做的只是触发一个父组件关心的内部事件。
1 | <div id="counter-event-example"> |
1 | Vue.component('button-counter', { |
这个可能需要解释一下(自己的理解),首先加载当前的button
按钮,当前按钮的click
执行组件的incrementHandler
,然后执行当前组件在html
中的click
事件,为什么要反向执行呢?因为页面中绑定的事件是 当前vue_det
下的事件。
如果你想在某个组件的根元素上监听一个原生事件。可以使用 .native 修饰 v-on 。例如:
1 | <my-component v-on:click.native="doTheThing"></my-component> |
data 必须是一个函数
上面例子中,可以看到 button-counter 组件中的 data 不是一个对象,而是一个函数:
1 | data: function () { |
这样的好处就是每个实例可以维护一份被返回对象的独立的拷贝,如果 data 是一个对象则会影响到其他实例,如下所示(没有尝试,js基础知识):
1 | <div id="components-demo3" class="demo"> |
Vue.js 自定义指令
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
全局指令:实例 v-focus
1 | <p>页面载入时,input 元素自动获取焦点:</p> |
1 | // 注册一个全局自定义指令 v-focus |
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
局部指令:实例 v-focus
把上面的代码注释掉。
1 | var vm = new Vue({ |
钩子
钩子函数
指令定义函数提供了几个钩子函数(可选):
bind
: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。inserted
: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。update
: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。componentUpdated
: 被绑定元素所在模板完成一次更新周期时调用。unbind
: 只调用一次, 指令与元素解绑时调用。
钩子函数参数
钩子函数的参数有:
- el: 指令所绑定的元素,可以用来直接操作 DOM 。
- binding: 一个对象,包含以下属性:
- name: 指令名,不包括
v-
前缀。 - value: 指令的绑定值, 例如:
v-my-directive="1 + 1"
, value 的值是2
。 - oldValue: 指令绑定的前一个值,仅在
update
和componentUpdated
钩子中可用。无论值是否改变都可用。 - expression: 绑定值的表达式或变量名。 例如
v-my-directive="1 + 1"
, expression 的值是"1 + 1"
。 - arg: 传给指令的参数。例如
v-my-directive:foo
, arg 的值是"foo"
。 - modifiers: 一个包含修饰符的对象。 例如:
v-my-directive.foo.bar
, 修饰符对象 modifiers 的值是{ foo: true, bar: true }
。
- name: 指令名,不包括
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在
update
和componentUpdated
钩子中可用。
以下实例演示了这些参数的使用:
实例
1 | // 注册一个全局自定义指令 v-focus |
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
1 | <div v-maxzhao_dir:a.b.c='message' v-maxzhao_color="{ color: 'green', text: 'maxzhao' }" ></div> |
1 | Vue.directive('maxzhao_color', function (el, binding) { |
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
1 | Vue.directive('maxzhao_color', function (el, binding) { |
Vue.js 路由(终于到了激动人心,阔步前进的时刻)
本章节我们将为大家介绍 Vue.js 路由。
Vue.js 路由允许我们通过不同的 URL 访问不同的内容。
通过 Vue.js 可以实现多视图的单页Web应用(single page web application,SPA)。
Vue.js 路由需要载入 vue-router 库
中文文档地址:vue-router文档。
打住:如果是按照本文的安装方式,则默认已经安装了路由
安装
1、直接下载 / CDN
1 | wget https://unpkg.com/vue-router/dist/vue-router.js |
2、NPM
推荐使用淘宝镜像:
1 | cnpm install vue-router |
简单实例
Vue.js + vue-router 可以很简单的实现单页应用。
以下实例中我们将 vue-router 加进来,然后配置组件和路由映射,再告诉 vue-router 在哪里渲染它们。
HTML代码如下
1 | <div id="app-router-demo"> |
JavaScript 代码
1 | // 0. 如果使用模块化机制编程,导入 Vue 和 VueRouter,要调用 Vue.use(VueRouter) |
打眼一看,怎么还是和安装的不一样?这时候的我也是一脸懵逼。先尝试一下这个。最终还是不行,因为new VueRouter
这个是直接报错的。采用当前的方式引入:
1 | import VueRouter from 'vue-router' |
接下来我把教程的所有代码都删掉了,直接看脚手架的源码。
直接上手脚手架
为了方便阅读,把router/index.js
改为router/indexRouter.js
,此时,会有 test/unit/jest.conf.js
中的 js 路径修改。
当我想把indexRouter.js
移动到components
目录下的时候,发现界面报错了。
1 | ERROR Failed to compile with 2 errors |
我就按照提示进行了安装
1 | npm install --save vue-router/types vue/types |
提示:此处有一个build/webpack.base.conf.js
文件下的
1 | module.exports = { |
提示: /home/maxzhao/code/vue/vue_maxzhao/src/router/index.js
文件下
1 | // exxport default 只能导出一个对象,直接引入就可以使用 |
导出多个对象
1 | export const str = 'hello world'; |
实践
在src/router/index.js
中插入
1 | import Vue from 'vue' |
新建src/components/HelloMaxzhao.vue
1 | <template> |
浏览器访问:http://localhost:8080/#/hello_maxzhao
点击过的导航链接都会加上样式 **class =”router-link-exact-active router-link-active”**。
<router-link>
相关属性
接下来我们可以了解下更多关于
to
表示目标路由的链接。 当被点击后,内部会立刻把 to 的值传到 router.push(),所以这个值可以是一个字符串或者是描述目标位置的对象。
1 | <router-link to="/hello_maxzhao" >to /hello_maxzhao</router-link><br> |
replace
设置 replace 属性的话,当点击时,会调用 router.replace() 而不是 router.push(),导航后不会留下 history 记录。
1 | <router-link :to="{ path: '/abc'}" replace></router-link> |
append
设置 append 属性后,则在当前 (相对) 路径前添加基路径。例如,我们从 /a 导航到一个相对路径 b,如果没有配置 append,则路径为 /b,如果配了,则为 /a/b
1 | <router-link :to="{ path: 'relative/path'}" append></router-link> |
tag
有时候想要 <router-link>
渲染成某种标签,例如 <li>
。 于是我们使用 tag
prop 类指定何种标签,同样它还是会监听点击,触发导航。
1 | <router-link to="/foo" tag="li">foo</router-link> |
active-class
设置 链接激活时使用的 CSS 类名。可以通过以下代码来替代。
1 | <style> |
注意这里 class 使用 **active_class=”_active”**。
exact-active-class
配置当链接被精确匹配的时候应该激活的 class。可以通过以下代码来替代。
1 | <p> |
router-link 默认情况下的路由是模糊匹配,例如当前路径是 /article/1 那么也会激活
1 | <router-link to="/article" active-class="router-active"></router-link> |
当用户访问 /article/1 时会被激活为:
1 | <a href="#/article" class="router-active" rel="nofollow"></a> |
而当使用:
1 | <router-link to="/article" exact-active-class="router-active"></router-link> |
当用户访问 /article/1 时,不会激活这个 link 的 class:
1 | <a href="#/article" rel="nofollow"></a> |
event
声明可以用来触发导航的事件。可以是一个字符串或是一个包含字符串的数组。
1 | <router-link v-bind:to = "{ path: '/route1'}" event = "mouseover">Router Link 1</router-link> |
以上代码设置了 event 为 mouseover ,及在鼠标移动到 Router Link 1 上时导航的 HTML 内容会发生改变。
NPM 路由实例
接下来我们演示了一个使用 npm 简单的路由实例,开始前,请先下载该实例源代码:
路由实例
你也可以在 Github 上下载:https://github.com/chrisvfritz/vue-2.0-simple-routing-example
下载完后,解压该目录,重命名目录为 vue-demo,vu 并进入该目录,执行以下命令:
1 | # 安装依赖,使用淘宝资源命令 cnpm |
如果你需要发布到正式环境可以执行以下命令:
1 | cnpm run build |
执行成功后,访问 http://localhost:8080 即可看到如下界面:
beforeEach 跳转路由前
1 | router.beforeEach((to, from, next) => { |
to: Route: 即将要进入的目标 路由对象
from: Route: 当前导航正要离开的路由
next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。
- next(): 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。
- next(false): 中断当前的导航。如果浏览器的 URL 改变了 (可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。
- next(‘/‘) 或者 next({ path: ‘/‘ }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。你可以向 next 传递任意位置对象,且允许设置诸如 replace: true、name: ‘home’ 之类的选项以及任何用在 router-link 的 to prop 或 router.push 中的选项。
- next(error): (2.4.0+) 如果传入 next 的参数是一个 Error 实例,则导航会被终止且该错误会被传递给 router.onError() 注册过的回调。
afterEach 跳转路由后
1 | router.afterEach(() => { |
Vue.js 混入
混入 (mixins)定义了一部分可复用的方法或者计算属性。混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项。
来看一个简单的实例:
实例
1 | // 定义一个混入对象 |
选项合并
当组件和混入对象含有同名选项时,这些选项将以恰当的方式混合。
比如,数据对象在内部会进行浅合并 (一层属性深度),在和组件的数据发生冲突时以组件数据优先。
以下实例中,Vue 实例与混入对象包含了相同的方法。从输出结果可以看出两个选项合并了。
1 | var mixin = { |
输出结果为:
1 | 混入调用 |
如果 methods 选项中有相同的函数名,则 Vue 实例优先级会较高。如下实例,Vue 实例与混入对象的 methods 选项都包含了相同的函数:
相同的函数名
1 | var mixin = { |
输出结果为:
1 | HelloWorld 方法 |
以上实例,我们调用了以下三个方法:
1 | vm.hellworld(); |
从输出结果 methods 选项中如果碰到相同的函数名则 Vue 实例有更高的优先级会执行输出。并且全局方法不执行。
全局混入
也可以全局注册混入对象。注意使用! 一旦使用全局混入对象,将会影响到 所有 之后创建的 Vue 实例。使用恰当时,可以为自定义对象注入处理逻辑。
1 | // 为自定义的选项 'myOption' 注入一个处理器。 |
谨慎使用全局混入对象,因为会影响到每个单独创建的 Vue 实例 (包括第三方模板)。
Vue.js Ajax(vue-resource)
Vue 要实现异步加载需要使用到 vue-resource 库。
1 | <script src="https://cdn.staticfile.org/vue-resource/1.5.1/vue-resource.min.js"></script> |
Get 请求
以下是一个简单的 Get 请求实例,请求地址是一个简单的 txt 文本:
如果需要传递数据,可以使用 this.$http.get(‘get.php’,{params : jsonData}) 格式,第二个参数 jsonData 就是传到后端的数据。
1 | this.$http.get('get.php',{params : {a:1,b:2}}).then(function(res){ |
post 请求
post 发送数据到后端,需要第三个参数 **{emulateJSON:true}**。
emulateJSON 的作用: 如果Web服务器无法处理编码为 application/json 的请求,你可以启用 emulateJSON 选项。
demo_test_post.php 代码如下:
1 | <?php |
语法 & API
你可以使用全局对象方式 Vue.http 或者在一个 Vue 实例的内部使用 this.$http来发起 HTTP 请求。
1 | // 基于全局Vue对象使用http |
vue-resource 提供了 7 种请求 API(REST 风格):
1 | get(url, [options]) |
除了 jsonp 以外,另外 6 种的 API 名称是标准的 HTTP 方法。
options 参数说明:
参数 | 类型 | 描述 |
---|---|---|
url | string |
请求的目标URL |
body | Object , FormData , string |
作为请求体发送的数据 |
headers | Object |
作为请求头部发送的头部对象 |
params | Object |
作为URL参数的参数对象 |
method | string |
HTTP方法 (例如GET,POST,…) |
timeout | number |
请求超时(单位:毫秒) (0 表示永不超时) |
before | function(request) |
在请求发送之前修改请求的回调函数 |
progress | function(event) |
用于处理上传进度的回调函数 ProgressEvent |
credentials | boolean |
是否需要出示用于跨站点请求的凭据 |
emulateHTTP | boolean |
是否需要通过设置X-HTTP-Method-Override 头部并且以传统POST方式发送PUT,PATCH和DELETE请求。 |
emulateJSON | boolean |
设置请求体的类型为application/x-www-form-urlencoded |
通过如下属性和方法处理一个请求获取到的响应对象:
属性 | 类型 | 描述 |
---|---|---|
url | string |
响应的 URL 源 |
body | Object , Blob , string |
响应体数据 |
headers | Header |
请求头部对象 |
ok | boolean |
当 HTTP 响应码为 200 到 299 之间的数值时该值为 true |
status | number |
HTTP 响应码 |
statusText | string |
HTTP 响应状态 |
方法 | 类型 | 描述 |
text() | 约定值 |
以字符串方式返回响应体 |
json() | 约定值 |
以格式化后的 json 对象方式返回响应体 |
blob() | 约定值 |
以二进制 Blob 对象方式返回响应体 |
axios(听说比vueresource更好)
基于promise用于浏览器和node.js的http客户端
特点
- 支持浏览器和node.js
- 支持promise
- 能拦截请求和响应
- 能转换请求和响应数据
- 能取消请求
- 自动转换JSON数据
- 浏览器端支持防止CSRF(跨站请求伪造)
安装
npm安装
1 | npm install axios |
bower安装
1 | bower install axios |
通过cdn引入
1 | <script src="https://unpkg.com/axios/dist/axios.min.js"></script> |
例子
发起一个GET
请求
1 | // Make a request for a user with a given ID |
发起一个POST
请求
1 | axios.post('/user', { |
同时发起多个请求
1 | function getUserAccount() { |
官方地址:http://www.axios-js.com/zh-cn/docs/
其它插件
NProgress 进度条
1 | NProgress.start() // —start |
vuedraggable 拖动
vue-count-to 数字滚动
showdown 使页面支持 markdown
Mock.mock() 拦截请求响应数据
问题
Failed to mount component: template or render function not defined.
1 | [Vue warn]: Failed to mount component: template or render function not defined. |
因为 vue
版本高了,需要在 require
之后 加上 default, 来指定文件中的 export default
1 | Try adding .default to the end of your require(). |
You cannot set a form field before rendering a field associated with the value
只能少传参,不能多传、错传参数。
1 | let thisDetail = pick(that.detail, 'money', |