05_01.vue-plugin

axios

  • 一个前后端通用的http请求库
  • 在浏览器环境中使用XMLHttpRequest对象, Node中使用http模块

入门

  • 在浏览器环境中导入库, 然后使用库暴露的全局变量axios发送请求
get请求
  • 成功回调接收一个response对象, 要拿到请求回来的数据, 需要通过respone.data来取
  • 函数调用会返回一个Promise实例, 通过then或catch添加成功失败回调
axios.get('http://vue.studyit.io/api/getprodlist')   // 得到一个Promise实例,
.then((rep) => console.log(rep.data))                   // 得到response对象, 通过data属性拿数据
.catch((err) => console.log(err))                           // 得到错误描述对象
post请求
axios.get('http://vue.studyit.io/api/getprodlist')   // 得到一个Promise实例, 通过then或catch添加成功失败回调
.then((rep) => console.log(rep.data))                   // 得到response对象, 通过data属性拿数据
.catch((err) => console.log(err))                           // 得到错误描述对象

语法

axios(config)

// 类似与jQ的ajax方法
axios({
    url: '',
    method: 'post',
    data: {}
}).then()

axios.method()

// 类似与jQ的get、post方法
axios.get(url, config)
axios.post(url, data, config)
axios.delete(url, config)
axios.head(url, config)
axios.put(url, data, config)
axios.patch(url, data, config)

特点

  • 可以拦截请求与响应,或取消请求,或进行统一的请求配置与处理

使用

get请求

let config = {
    params: { pageindex: 1 }
};
axios.get('/news/list', config)
    .then(rep => {
        console.log(rep.data);
    });

post请求

let data = {
    user_name: 'self',
    user_pwd: 111111
};
axios.post('/login', data)
    .then(rep => {
        console.log(rep.obj);
    });

默认配置

let config = {
  url:'/user',
  method:'get' //default
  baseURL:'https://some-domain.com/api/',
  transformRequest:[function(data){}],
  headers: {'X-Requested-With':'XMLHttpRequest'},
  params: {
    ID:12345
  },
  ...
};
axios.defaults = Object.as

vue-router

简介

作用

  • 专为vue开发SPA单页应用时所提供的插件
  • 能够让我们可以使用前端路由控制组件的渲染

基本原理

  • 普通的页面跳转都是由后端来控制的
  • 我们可以修改浏览器地址栏的url,或者修改location.href值,向服务器发送请求切换页面
  • 如果我们仅仅修改url中的hash值,浏览器是不会向页面发出请求的
  • vue-router的运作原理就是利用hash的变化实现组件的动态切换,达到切换页面效果的目的
  • vue-router内部使用了hash与H5两种方式

基本使用

<div id="app">
    <header></header>
    <!-- 占位标签,路由变化时会动态切换组件,作用类似与component标签 -->
    <router-view></router-view>
    <footer></footer>
</div>
// 全局登陆组件
let LoginComponent = {
    template: '<h4>登陆</h4>'
};
// 全局注册组件
let RegisterComponent = {
    template: '<h4>注册</h4>'
});
// 实例
var vm = new Vue({
    el: '#app',
    // 路由配置
    router: new VueRouter({
        routes: [
            { path: '/login', component: LoginComponent },
            { path: '/register', component: RegisterComponent }
        ]
    })
});

路由实例与路由对象

说明

  • 配置了路由之后,在vue实例与组件身上会被注入两个对象$router与$route
  • $router为new VueRouter()得到的实例,里面记录了路由配置信息,并提供了一些方法供我们调用
  • $route为页面hash值解析后的一个对象,有点类似于node中url.parser(req.url)的返回结果

$route常用属性

  • 注意:下面的属性都是对页面location.hash值进行的解析提取,不是location.href
  • fullPath:完整路径,包含query与hash
  • path:纯路径
  • query:查询字符串解析后得到的对象
  • params:路径参数解析后得到的对象
  • name:当前路由配置的name属性

使用路由参数

// 全局详情组件
var comDetails = Vue.extend({
    template: '<article>详情</article>',
    created: function() {
        let id = this.$route.params.id;
        console.log(this.$route, id);
    }
});
// 实例
var vm = new Vue({
    el: '#app',
    // 路由配置
    router: new VueRouter({
        routes: [
            { path: '/details/:id', component: 'v-details' }
        ]
    })
});

跳转页面

标签跳转

  • 如果要通过点击页面元素实现页面跳转可以使用router-link标签
  • router-link标签最终会被替换为普通的a标签,但router-link标签使用更灵活
  • 写法1:<router-link to="/login?keyword=1122">演示</router-link>
  • 写法2:<router-link :to="{ path: '/login', query: { keyword: 1122 } }">演示</router-link>
  • 写法3:<router-link :to="{ name: 'go', query: { keyword: 1122 } }">演示</router-link>

示例

<div id="app">
    <header>
        <router-link to="/login?a=1">登陆-路径</router-link>
        <router-link :to="{ name: 'go', query: {b: 2} }">登陆-别名</router-link>
    </header>
    <!-- 占位标签,路由变化时会动态切换组件,作用类似与component标签 -->
    <router-view></router-view>
    <footer></footer>
</div>
// 全局登陆组件
Vue.component('v-login', {
    template: '<h4>登陆</h4>'
});
// 实例
var vm = new Vue({
    el: '#app',
    // 路由配置
    router: new VueRouter({
        routes: [
            { name: 'go', path: '/login', component: 'v-login' }
        ]
    })
});

js跳转

  • 如果向通过js来实现页面跳转可以使用$router.push方法
  • 写法1:$router.push('/login')
  • 写法2:$router.push({path:'/login', query:{aa:11}})
  • 写法3:$router.push({name:'details', params:{id:1}, query:{aa:11}})

示例

// 实例
var vm = new Vue({
    el: '#app',
    method: {
        to: function(path) {
            this.$router.push(path);
        }
    },
    // 路由配置
    router: new VueRouter({
        routes: [
            { path: '/login', component: 'v-login' },
            { name: 'details', path: '/details/:id', component: 'v-details' },
        ]
    })
});
vm.$router.push('/login');
vm.$router.push({path:'/login', query:{aa:11}});
vm.$router.push({name:'details', params:{id:1}, query:{aa:11}});

重定向

new VueRouter({
    routes: [
        // 访问根路径时重定向到index
        { path: '/', redirect: '/index' }
        // 也可以使用名字进行重定向
        { path: '/', redirect: { name: 'i' } },
        { path: '/index', component: IndexComt },
    ]
})

监听路由变化

new Vue({
    el: '#app',
    watch: {
        $route: function(to, from) {
            console.log(`${from.path}跳转到了${to.path}`);
        }
    },
    // 路由配置
    router: router
});

嵌套路由

说明

  • 项目中有时候会出现组件嵌套组件的情况
  • 这些子组件也要根据url进行动态切换,那么就需要嵌套配置
  • 注意:嵌套配置时子路由path自动继承父路由path的path,配置时不要在前面加'/'

示例

let Compt1 = Vue.extend({
    template: '<p>子组件1</p>'
});
let Compt2 = Vue.extend({
    template: '<p>子组件2</p>'
});
let ComptContent = Vue.extend({
    template: `
    <div>
        <p>父级组件</p>
        <router-view></router-view>
    </div>`
});
// 路由配置
let router = new VueRouter({
    routes: [
        { path: '/page', component: ComptContent,
          children: [
            { path: 'one', component: Compt1 },
            { path: 'two', component: Compt2 }
          ]
        }
    ]
});
// 实例
var vm = new Vue({
    el: '#app',
    router: router
});

vuex

简介

  • vuex是专为vue开发的状态管理插件(数据管理)
  • 当项目中存在比较复杂的组件数据依赖或共享时可以考虑使用

基本使用

需求

[图片上传失败...(image-850277-1510905953832)]

实现

<div id="app">
    <div>
        <span>最大总数:{{ maxTotal }}</span>
        <span>当前总数:{{ total }}</span>
    </div>
    <v-numbox></v-numbox>
    <v-numbox></v-numbox>
</div>
// 数字框组件
Vue.component('v-numbox', {
    template:
        `<div>
            <button @click="sub">-</button>
            <input v-model="num"/>
            <button @click="add">+</button>
        </div>`,
    data() {
        return {
            num: 0
        };
    },
    methods: {
        add() {
            var state = this.$store.state;
            if(state.total < state.maxTotal) {
                this.num++;
                this.$store.commit('addTotal');
            }
        },
        sub() {
            if(this.num > 0) {
                this.num--;
                this.$store.commit('subTotal');
            }
        }
    }
});
// 共享数据
var store = new Vuex.Store({

    // 数据定义
    state: {
        maxTotal: 10,
        total: 0
    },

    // 修改数据的方法
    mutations: {
        addTotal(state) {
            state.total++;
        },
        subTotal(state) {
            state.total--;
        }
    }

});
// 实例
var vm = new vue({
    el: '#app',
    store,
    computed: {
        maxTotal() {
            return this.$store.state.maxTotal;
        },
        total() {
            return this.$store.state.total;
        }
    }
});

进阶

配置项

  • state
    • @作用:定义所有的状态
  • getter
    • @作用:定义获取状态的方法
    • @备注:如果不需要对状态进行加工,直接通过state访问属性即可,无需调用这里的方法获取
  • mutations
    • @作用:定义修改状态的方法
    • @备注:想要Vue调试工具监听状态的变化过程,必须调用这里的方法进行修改,否则监听不到
  • actions
    • @作用:定义异步调用mutations方法的方法
    • @备注:想要Vue调试工具准确计算状态异步变化后的值,必须在这里异步调用mutations里的方法,否则值有错误
  • modules
    • @作用:分割store为不同的模块

其他方法

  • Vuex.mapState
  • Vuex.mapGetters
  • Vuex.mapMutations
  • Vuex.mapActions
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容