前端路由和vuex状态管理

一、前端路由的基本用法

1.安装

npm install --save vue-router

2、引用

import router from 'vue-router'   //引入路由
Vue.use(router)     // vue 提供的使用路由方法

3、配置路由文件,并在vue实例中注入

var rt = new router({
    routes: [{
         path: '/',//指定要跳转的路径
          component: HelloWorld//指定要跳转的组件
        }]
})
new Vue({
    el: '#app',
    router: rt,   //  在vue实例中注入路由
    components: { App },
    template: '<App/>'
})

4、 确定视图加载的位置

<router-view></router-view>
二、vue­-router路由的跳转
<router-link to="/"></router-link>

to后面接的是需要跳转的路径,如下:

<router-link to="/helloworld">HELLO WORLD</router-link>
三、 vue­-router路由参数的传递

1、必须在路由内加入路由的name

export default new router({
routes: [
    {
        name:'helloworld',   //在路由内加入路由的name,名字可以自定义
        path: '/HelloWorld/:worldmsg',  
        component: HelloWorld  
    },
]
})

2、必须在path后加/: +传递的参数

export default new router({
routes: [
    {
        name:'helloworld',   
        path: '/HelloWorld/:worldmsg',  //必须在path后加 /: +传递的参数
        component: HelloWorld  
    },
]
})
  1. 传递参数
    首先在:to中引用前面定义的name名字,其中传递参数命名params是固定的设置,不能更改
 <ul>
     <li>
    /* 传递参数 */
 <router-link :to="{name:'helloworld',params:{worldmsg:'我的世界'}}">Hello World</router-link>
    </li>
 </ul>

4、接收参数
读取参数: $route.params.XXX

<template>
  <div class="hello">
    <h3>{{$route.params.worldmsg}}</h3>    //接收参数
  </div>
</template>

补充一点:这是另外一种传递参数和接收参数方法,目前用的不多,后续可以再详细了解。

<router-link
    :to="{path: '/helloearth',query:{msg: 只有一个地球}}">HELLO WORLD</router-link>
方式:===/helloworld?name=XX&count=xxx
函数模式
四、 Axios之get请求详解

axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它本身具有以下特征:
------------从浏览器中创建 XMLHttpRequest
------------从 node.js 发出 http 请求
------------支持 Promise API
------------拦截请求和响应
------------转换请求和响应数据
------------取消请求
------------自动转换JSON数据
------------客户端支持防止 CSRF/XSRF

  1. 安装
npm install axios
  1. 引入加载
import axios from 'axios'
  1. 将axios全局挂载到VUE原型上
Vue.prototype.$http = axios;
  1. 发出请求 以cnode社区API为例子
methods:{
getdata:function(){
  var self =this
  this.$http.get('https://cnodejs.org/api/v1/topics',{
        params:{   //还可以用下面提到第二种传递参数形式
            page:1,
            limit:15
         }
    })
  .then(function(res){        //then()是promise中的方法,成功则调用,详细可以看ES6
        console.log(res)
        self.items=res.data.data
        
  })
  .catch(function(err){   //catch()是promise中的方法,失败时候调用,详细可以看ES6
        console.log(err)
  })
},

}

两种传递参数的形式
第一种

axios.get('/user', {
      params: {
            ID: 12345
        }
})

axios.get('/user', {
      ID: 12345
  })

第二种

axios.get('https://cnodejs.org/api/v1/topics?page=1&limit=15')

使用CNODE社区官方的API为例展开学习
获取主题列表API:https://cnodejs.org/api/v1/topics
参数:page页码、limit 每页显示的数量

五、 Axios之post请求详解

post请求和get请求没有太大区别,在get请求基础上安装一个插件qs插件,利用qs.stringify()方法传递参数。

1、安装

npm install qs

2、引入

import qs from 'qs'

 postdata:function(){
      var self =this
      this.$http.post(url,qs.stringify({
            page:1,
            limit:20
      }))
    .then(function(res){
          console.log(res)
          self.items=res.data.data
        
      })
  .catch(function(err){
        console.log(err)
    })
  },

POST传递数据有两种格式:
form­-data ?page=1&limit=48
x­-www­-form­-urlencoded { page: 1,limit: 10 }

代码已上传到github

六、 初识Vuex之store

用来管理状态,共享数据,在各个组件之间管理外部状态

第一步:项目安装vuex插件

npm i vuex

第二步:引入vuex,并通过use方法使用它

import Vuex from 'vuex'
Vue.use(Vuex)

第三步: 创建状态仓库

//创建状态仓库,注意第二个Store是大写的不能改,,state也是不能改
var store = new Vuex.Store({
state:{
      XXX:xxx
      }
})

第四步:注入Vue实例当中

 new Vue({
  el: '#app',
  router,
  store,   //注入store,当键名(key)和值(value)名字一样可以这样缩写
  components: { App },
  template: '<App/>'
})

第五步:通过this.$sore.state.XXX拿到全局状态

computed:{
    getOutterNum:function(){
      return this.$store.state.XXX
    }
  }
七、Vuex的相关操作

vuex状态管理的流程
view——­>actions—–>mutations—–>state——­>view

一、
方法一、更改 Vuex 的 store 中的状态的唯一方法是提交 mutation

var store = new Vuex.Store({
  state:{
        num:88
        },
  mutations:{    //定义状态改变函数
      increase:function(state){
           state.num++
      },
      decrease:function(state){
          state.num--
      }
  }
})

利用commit来触发mutations函数

 methods:{
    sadd:function(){
      this.$store.commit('increase')  //commit方法里面是mutations定义的函数名
    }
  },

方法二:
利用actions中对mucations进行操作,间接对state进行修改

 mutations:{
    increase:function(state){
         state.num++
    },
    decrease:function(state){
         state.num--
    }
  },
  actions:{   //actions中只能对mucations进行操作
      //context为上下文对象
     decreaseActions:function(context){
          context.commit('decrease')  //decrease方法是mucations中定义的方法
    }
  }

})

利用dispatch来触发actions函数

saddActions:function(){
      //dispatch方法里面是actions定义的函数名
      this.$store.dispatch('decreaseActions')
    }

mucations和actions两者之间区别
1、传递参数不一样,前者传递是state,后者传递是context。
2、调用的方式不一样,前者靠this.$store.commit('xxx')触发,后者靠this.$store.dispatch('xxx')触发。
3、actions可以包含异步操作,但是mutation只能包含同步操作

actions:{  
     decreaseActions:function(context){
       setTimeout(() => {     //延时一秒的异步操作
        context.commit('decrease')
       }, 1000);
    }
  }

二、getters是vuex中的一个属性,主要作用于vue中的计算属性(computed)类似,用来存放一些经过修改的数值

 getters:{
      getNum:function(state){
         return state.num>0? state.num:0
      } 
  }

在调用getters中的内容是使用$store.getters.函数名进行调用

computed:{
    getParentNum:function(){
      return this.$store.getters.getNum   //getNum是getter里面定义方法
    }
  }
总结:在工程化项目中,vuex所有内容建议和routers一样,在src中建立一个state文件夹>index.js,将vuex内容写在index.js中,再导出到main.js中。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容