【卷起来】VUE3.0教程-08-路由管理

在Vue中,我们可以通过vue-router路由管理页面之间的关系。

Vue Router是Vue.js的官方路由,它与Vue.js核心深度集成,让用Vue.js构建单页应用变得轻而易举。

🌲 在Vue中引入路由

  • 安装路由
npm install --save vue-router

  • 建立三个vue组件

<template>
    <h1>关于我们</h1>
</template>

<script setup>
</script>
<template>

    <h1>管理系统主页</h1>
</template>
<template>
    <h1>展示消息</h1>
</template>
  • 配置独立的路由文件

在src中新建一个文件夹router,在其中新建一个index.js

import {createRouter,createWebHistory} from 'vue-router'

const routes = [
    {
        path:'/',
        name:'home',
        component:()=> import('../components/HomeView.vue')
    },{
        path:'/about',
        name:'about',
        component:()=> import('../components/AboutDemo.vue')
    },{
        path:'/show',
        name:'show',
        component:()=> import('../components/ShowDemo.vue')
    }
]

const router=createRouter({
    history:createWebHistory() // 去掉请求后面的#
    ,routes
})

export default router;
  • 在main.js中挂载路由
import axios from 'axios'

import { createApp } from 'vue'
import App from './App.vue'
// 挂载目录
import router from './router'

const app = createApp(App)
app.config.globalProperties.$axios = axios
app.use(router)
app.mount('#app')
  • 指定路由入口和路由跳转
<script setup>

  
</script>

<template>
  <!-- <AxiosDemo></AxiosDemo> -->
  <!-- <RequestAxiosDemo></RequestAxiosDemo> -->
  <div>
    <nav>
      <!--指定路由显示入口和跳转路径 -->
      <RouterLink to="/">Home</RouterLink> | 
      <RouterLink to="/about">About</RouterLink> | 
      <RouterLink to="/show">Show</RouterLink>
    </nav>
  </div>
  <div>
    <!--路由入口  -->
    <RouterView></RouterView>
    <!-- <router-view></router-view> -->
  </div>
 
</template>


  • 配置好后,可以使用<router-view> 或者<RouterView>指定路由入口
  • 可以使用<router-link> 或者<RouterLink> 指定路由跳转

🌲 路由传参

页面跳转过程中,是可以携带参数的,这也是很常见的业务

比如:在一个列表项,点击进入查看每个列表项的详情

  • 第一步:在路由配置中指定参数的key
{
    path:'/hero/:id',
    name:"delete",
    component:()=>import("../components/DeleteDemo.vue")
}
  • 第二步:在跳转过程中携带参数
<nav>
  <RouterLink to="/">Home</RouterLink> | 
  <RouterLink to="/about">About</RouterLink> | 
  <RouterLink to="/show">Show</RouterLink>|
  <router-link :to="{name:'delete', params: {id:23}}"> 删除数据</router-link>  
</nav>  
  • 第三步:在详情页面读取路由携带的参数:
    • 模板中读取: this.$route.params.id }
template>
    <h1>删除消息</h1>
    <!-- <div>{{ result }}</div> -->
    <div >{{ this.$route.params.id }}</div>
</template>
    • js中读取:route.params.id
<script setup>
    import axios from 'axios';
    import { reactive,ref } from 'vue';
  import router  from '../router'
    import { useRoute } from 'vue-router';
    //获取通过函数获取route对象
    const route = useRoute()
    const result = reactive({})
    axios.delete("/api/hero/"+route.params.id).then(res=>{
        result.value = res.data
        console.log(res.data)
      // 路由跳转:类似于Servlet中的重定向
        router.push("/show")
    })
</script>

完整案例代码:

import {createRouter,createWebHistory} from 'vue-router'


const routes = [
    {
        path:'/',
        name:'home',
        component:()=> import('../components/HomeView.vue')
    },{
        path:'/about',
        name:'about',
        component:()=> import('../components/AboutDemo.vue')
    },{
        path:'/show',
        name:'show',
        component:()=> import('../components/ShowDemo.vue')
    },{
        path:'/hero/:id',
        name:"delete",
        component:()=>import("../components/DeleteDemo.vue")
    }
]

const router=createRouter({
    history:createWebHistory() // 去掉请求后面的#
    ,routes
})

export default router;
<template>
    <h1>删除消息</h1>
    <!-- <div>{{ result }}</div> -->
    <div >{{ this.$route.params.id }}</div>
</template>

<script setup>
    import axios from 'axios';
    import { reactive,ref } from 'vue';
    import router  from '../router'
    import { useRoute } from 'vue-router';
    //获取通过函数获取route对象
    const route = useRoute()
    const result = reactive({})
    axios.delete("/api/hero/"+route.params.id).then(res=>{
        result.value = res.data
        console.log(res.data)
        
        // 路由跳转:类似于Servlet中的重定向
        router.push("/show")
    })
</script>

<script setup>

  
</script>

<template>
  <!-- <AxiosDemo></AxiosDemo> -->
  <!-- <RequestAxiosDemo></RequestAxiosDemo> -->
  <div>
    <nav>
      <RouterLink to="/">Home</RouterLink> | 
      <RouterLink to="/about">About</RouterLink> | 
      <RouterLink to="/show">Show</RouterLink>|
      <router-link :to="{name:'delete', params: {id:26}}"> 删除数据</router-link>
      
    </nav>  
  </div>
  <div>
    <RouterView></RouterView>
    <!-- <router-view></router-view> -->
  </div>
 
</template>


🌲VUE的状态管理(VUEX)

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 + 库。它采 用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

简单来说,状态管理可以理解成为了更方便的管理组件之间的数据交互,提供了一个集中式的管理方案,任何组件都可以按照指定的方式进行读取和改变数据

🌿 引入Vuex的步骤

第一步:安装VueX

npm install --save vuex

第二步:配置Vuex文件

在src目录下,新建一个store文件夹,并在其中新建一个index.js,内容如下:


import {createStore} from 'vuex'

export default createStore({
    state:{
        // 当下状态管理中,存的数据
        counter:20
    }
})

第三步,在main.js中引入vuex

import axios from 'axios'

import { createApp } from 'vue'
import App from './App.vue'
// 挂载路由目录
import router from './router'
//引入状态管理
import store from './store'

const app = createApp(App)
app.config.globalProperties.$axios = axios
// 使用路由
app.use(router)
// 使用状态管理
app.use(store)
app.mount('#app')

第四步:在需要的位置获取状态管理中的数据

  • 在模板中获取:{{$store.state.counter  }}
  • 在js中获取: computed(() => store.state.counter)

具体写法:


<template>
    <h1>关于我们</h1>
    <!-- 在模板中获取状态管理中存的值 -->
    <p>当下访问了{{$store.state.counter  }}"次"</p>
    <p>当下访问了{{counter }}"次"</p>
</template>

<script setup>
    import { computed } from 'vue';
    // 在js中获取状态管理中存的值
    import { useStore } from "vuex"
    const store = useStore()
    // 需要通过计算属性
    const counter = computed(() => store.state.counter)
    
</script>

🌿 Getter

对Vuex中的数据进行过滤


import {createStore} from 'vuex'

export default createStore({
    state:{
        // 当下状态管理中,存的数据
        counter:18
    },
    getters:{
        getCount(state){
            return state.counter>18?state.counter:
              "当前访问人数太少,才"+state.counter
        }
    }
})

getter的访问方式:


<template>
    <h1>关于我们</h1>
    <!-- 在模板中获取状态管理中存的值 -->
    <p>当下访问了{{$store.getters.getCount  }}"次"</p>
    <p>当下访问了{{counter }}"次"</p>
</template>

<script setup>
    import { computed } from 'vue';
    // 在js中获取状态管理中存的值
    import { useStore } from "vuex"
    const store = useStore()
    // 需要通过计算属性
    const counter = computed(() => store.getters.getCount)
    
</script>

🌿 Mutaion

更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的事件类型 (type)和一个回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数.


import {createStore} from 'vuex'

export default createStore({
    state:{
        // 当下状态管理中,存的数据
        counter:18
    },
    getters:{
        getCount(state){
            return state.counter>18?state.counter:"当前访问人数太少,才"+state.counter
        
        }
    },
    mutations:{
        setCounter(state,num){
            state.counter += num
        }
    }
})

在js中调用修改数据的方法


<template>
    <h1>关于我们</h1>
    <!-- 在模板中获取状态管理中存的值 -->
    <p>当下访问了{{$store.state.counter  }}次</p>
    <!-- <p>当下访问了{{counter }}"次"</p> -->
 
</template>

<script setup>
    import { computed } from 'vue';
    // 在js中获取状态管理中存的值
    import { useStore } from "vuex"
    const store = useStore()
    // 需要通过计算属性
    // const counter = computed(() => store.getters.getCount)
    
    // 修改count属性值
    store.commit("setCounter",20)     
</script>

在另一个vue文件中访问状态管理的值,看是否能正常访问到修改后的值

<template>

    <h1>管理系统主页</h1>

    <p>当下访问了{{$store.state.counter  }}次</p>
</template>

<script setup>

</script>

🌿 Action

Action 类似于 mutation,不同在于:

  • Action 提交的是 mutation,而不是直接变更状态
  • Action 可以包含任意异步操作

import axios from 'axios'
import {createStore} from 'vuex'

export default createStore({
    state:{
        // 当下状态管理中,存的数据
        counter:18
    },
    getters:{
  		  //自定义的方法名
        getCount(state){
            return state.counter>18?state.counter:"当前访问人数太少,才"+state.counter
        
        }
    },
    mutations:{
       //自定义的方法名
        setCounter(state,num){
            state.counter += num
        }
    },
    actions:{
        //自定义的方法名
        asyncSetCount({commit}){
            axios.get("http://iwenwiki.com/api/generator/list.php")
                .then(res => {
                    console.log(res.data)
                    commit("setCounter",res.data[0])
                })
        }
    }
})

在js中调用自定义的actions方法:

store.dispatch("asyncSetCount")


<template>
    <h1>关于我们</h1>
    <!-- 在模板中获取状态管理中存的值 -->
    <p>当下访问了{{$store.state.counter  }}次</p>
    <!-- <p>当下访问了{{counter }}"次"</p> -->
 
</template>

<script setup>
    import { computed } from 'vue';
    // 在js中获取状态管理中存的值
    import { useStore } from "vuex"
    const store = useStore()
    // 需要通过计算属性
    // const counter = computed(() => store.getters.getCount)
    
    // 修改count属性值
    // store.commit("setCounter",20)

    store.dispatch("asyncSetCount")
  
    
</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听潮阁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值