11. vue-­router路由和vuex

11.1 vue-­router路由基本加载

小案例:在根路径下只显示图片,在/hello下即显示图片又显示helloWorld组件里的内容
简单四步走

  1. 安装
npm install --save vue-router
  1. 引用(在你的main.js里)
import router from 'vue-router'
Vue.use(router)
  1. 配置路由文件,并在vue实例中注入(也是在main.js)
var rt = new router({
  routes: [
    {
      path: '/hello',
      component: HelloWorld
    }
  ]
})
new Vue({
  el: '#app',
  router: rt,
  components: { App },
  template: '<App/>'
})

这里要注意的是如果你是在index.html之外的页面里使用vue-router,那么你路径设置为path='/'就是以你当前的html页面为根目录,比如在一个member.html里使用<router-view></router-view>,然后你在它的js里写path='/',比如你用的是本地端口,那么就是在localhost:8080/member.html/下使用组件,而不是localhost:8080/,也就是把你的member.html作为首页了,而正常情况下的/根目录其实就是你的首页,因为localhost:8080/index.html,因为index是可以省略的

  1. 确定视图加载的位置(在App.vue中)
    使用
<router-view></router-view>

如:

<template>
  <div id="app">
    <img src="./assets/logo.png">
    <!--也就是说当路径等于/hello的时候下面的<router-view>就会替换成HelloWorld组件里的内容-->
    <router-view></router-view>
  </div>
</template>

这就是让它在图片下方显示

11.2 vue-­router路由的跳转

  1. 通过给需要跳转的元素加<router-link to="/"></router-link>点击跳转到指定的路径
    list.vue
<template>
    <ul>
        <li>
            <router-link to="/helloWorld">hello world</router-link>
        </li>
        <li>
            <router-link to="/helloMeizi">hello meizi</router-link>
        </li>
    </ul>
</template>

router目录下的index.js

export default new router({
    routes: [
      {
        path: '/helloWorld',
        component: HelloWorld
      },
      {
          path: '/helloMeizi',
          component: HelloMeizi
      }
    ]
  })

通过上面的代码我们点击hello world就会跳转到/helloWorld路径下,同样点击/helloMeizi也是一个道理

  1. 编程式的导航
    router.push(location, onComplete?, onAbort?)
    注意:在 Vue 实例内部,你可以通过$router 访问路由实例。因此你可以调用this.$router.push
    当你点击 <router-link> 时,这个方法会在内部调用,所以说,点击 <router-link :to="..."> 等同于调用 router.push(...)。
    该方法的参数可以是一个字符串路径,或者一个描述地址的对象。例如:
// 字符串
router.push('home')

// 对象
router.push({ path: 'home' })

// 命名的路由
router.push({ name: 'user', params: { userId: 123 }})

// 带查询参数,变成 /register?plan=private
router.push({ path: 'register', query: { plan: 'private' }})

注意:如果提供了 path,params 会被忽略,上述例子中的 query 并不属于这种情况。取而代之的是下面例子的做法,你需要提供路由的 name 或手写完整的带有参数的 path:

const userId = 123
router.push({ name: 'user', params: { userId }}) // -> /user/123
router.push({ path: `/user/${userId}` }) // -> /user/123
// 这里的 params 不生效
router.push({ path: '/user', params: { userId }}) // -> /user

同样的规则也适用于 router-link 组件的 to 属性。

this.$router.replace
跳转到指定url路径,但是history栈中不会有记录,点击返回会跳转到上上个页面

11.3 vue­-router路由参数的传递

  1. 必须在路由内加入路由的name
  2. 必须在path后加/: +传递的参数
export default new router({
    routes: [
      {
        name: 'helloWorld',
        path: '/helloWorld/:worldmsg',
        component: HelloWorld
      },
      {
        name: 'helloMeizi',
        path: '/helloMeizi/:meizimsg',
        component: HelloMeizi
      }
    ]
  })

传递参数和接收参数看下边代码

<!--方式1 推荐-->
<ul>
    <li>
        <router-link :to="{name: 'helloWorld',params:{worldmsg:'你好世界'}}">hello world</router-link>
        读取参数在HelloWorld组件中通过:$route.params.XXX
        这种方式显示的路径为:/helloWorld/你好世界
  
    </li>
    <li>
        <router-link :to="{name: 'helloMeizi',params:{meizimsg:'你好妹子'}}">hello meizi</router-link>
    </li>
</ul>

<!--方式2 不推荐-->
<router-link :to="{path: '/helloWorld',query:{worldmsg:你好世界}}">
 hello world
</router-link>
显示的路径为:/helloWorld?name=XX&count=xxx
函数模式

你可以创建一个函数返回 props。这样你便可以将参数转换成另一种类型,将静态值与基于路由的值结合等等。

<template>
  {{q}} //比如当前是/search?q=5,那么此时就能拿到这个5
</template>
const router = new VueRouter({
  routes: [
    { path: '/search', component: SearchUser, props: (route) => ({
q: route.query.q }) }
  ]
})
然后在组件中
props:['q']

11.4 嵌套路由

let rt = new router({
    routes: [
        {
            path: '/',
            component: member,
        },
        {
            path: '/address',
            component: address,
            children: [
                {
                    // /address/all路径下显示all组件
                    path: 'all',
                    component: all
                },
                {
                    // /address/form路径下显示form组件
                    path: 'form',
                    component: form
                }
            ]
        },
    ]
})

上面代码当路径跳转到/address/all和/address/form的时候,分别显示嵌套的子路由组件all和form



那如果想要在/address路径下显示嵌套的子路由组件该怎么做?

  1. 给子路由一个空路径
{
  path: '/address',
  component: address,
  children: [
      {
          //在/address路径下显示嵌套路由组件all
          path: '',
          component: all
      },
  ]
},
  1. 通过重定向实现路由跳转
{
  path: '/address',
  component: address,
  children: [
      {
         //从路径''跳转到all,也就是从/address/ 跳转到 /address/all
          path: '',
          redirect: 'all'
      }
  ]
},

11.5.1 Axios之get请求详解

axios的简介:

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;//这里的$http随便什么名字都可以
  1. 发出请求 以cnode社区API为例子
<template>
  <div class="hello">
    <button @click="getDate">点击获取数据</button>
    <ul>
      <li v-for="item in items">{{item.title}}</li>
    </ul>
  </div>
</template>

<script>
import axios from 'axios'
Vue.prototype.$http = axios
import Vue from 'vue'
export default {
  name: 'HelloWorld',
  data () {
    return {
      items: []
    }
  },
  methods: {
    getDate(){
      this.$http.get('https://cnodejs.org/api/v1/topics',
        {
          params: {
            page:1,
            limit: 10
          }
        }
      )
      .then(
        (response)=>{
          this.items = response.data.data
        },
        (err)=>{
          console.log(err)
        }
      )
    }
  }
}
</script>

两种传递参数的形式

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 每页显示的数量

11.5.2 Axios之post请求详解

POST传递数据有两种格式:

  • form­data ?page=1&limit=48
  • x­www­form­urlencoded { page: 1,limit: 10 }

在axios中,post请求接收的参数必须是form­data
使用qs插件—­qs.stringify
npm i qs

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

推荐阅读更多精彩内容

  • ## 框架和库的区别?> 框架(framework):一套完整的软件设计架构和**解决方案**。> > 库(lib...
    Rui_bdad阅读 2,895评论 1 4
  • # 传智播客vue 学习## 1. 什么是 Vue.js* Vue 开发手机 APP 需要借助于 Weex* Vu...
    再见天才阅读 3,530评论 0 6
  • PS:转载请注明出处作者: TigerChain地址//www.greatytc.com/p/9a7d7...
    TigerChain阅读 63,491评论 9 218
  • 相关概念 混合开发和前后端分离 混合开发(服务器端渲染) 前后端分离后端提供接口,前端开发界面效果(专注于用户的交...
    他爱在黑暗中漫游阅读 2,777评论 4 45
  • 熊志军~【日精进打卡第339天】 4月19号卡 付达新商贸~众德营销 沈阳盛和塾道盛组/稻芽七组 【知~学习】 诵...
    熊志军阅读 119评论 0 0