• Vuex,Vue-router


    目录

    Vuex介绍

    Vuex的执行流程图:​编辑

     Vuex环境搭建

    Vue-router

    路由嵌套

    路由守卫

    vue-router路由使用


    Vuex介绍

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

    devtools extension (opens new window),提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试功能。

    在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。

    Vuex的执行流程图:

     Vuex环境搭建

    1. 安装

    npm install vuex --save
    

    2. 创建一个store文件夹,在store下创建一个index.js文件

    3. index.js中写代码

    1. import Vue from 'vue'
    2. import Vuex from 'vuex'
    3. Vue.use(Vuex)
    4. export default new Vuex.Store({
    5. state:{
    6. },
    7. getters: {
    8. },
    9. mutations:{
    10. },
    11. actions:{
    12. },
    13. modules: {
    14. }
    15. })

    4. 也可以是使用导出导入,逻辑代码多了就不会冗余。
    单独创建js文件,导出对象

    1. import Vue from 'vue'
    2. import Vuex from 'vuex'
    3. import actions from '@/store/actions'
    4. import mutations from '@/store/mutations'
    5. import state from '@/store/state'
    6. Vue.use(Vuex)
    7. export default new Vuex.Store({
    8. state,
    9. mutations,
    10. actions,
    11. })

    简单使用

    1.在state中定义变量

    state.js

    1. export default {
    2. count: 0
    3. }

    2.使用组件对象的$store里的dispatch方法,传入两个参数,第一个是actions对象里的方法名,字符串格式。(也可以直接执行commit方法,但是不建议)

     App.vue

    1. <template>
    2. <div id="app">
    3. {{ $store.state.count }}
    4. <p>
    5. <button @click="andOne">点击数字+1button>
    6. <button @click="minusOne">点击数字-1button>
    7. p>
    8. div>
    9. template>
    10. <script>
    11. export default {
    12. created() {
    13. console.log(this)
    14. },
    15. methods: {
    16. andOne() {
    17. // 点击+1按钮就会执行actions对象里的add方法
    18. this.$store.dispatch('add')
    19. },
    20. // 点击-1按钮就会执行actions对象里的downOne方法
    21. minusOne() {
    22. this.$store.dispatch('minusOne')
    23. }
    24. },
    25. }
    26. script>

    3.在actions对象中写add方法和minusOne方法

    1. export default {
    2. add(context) {
    3. console.log(context)
    4. context.commit('add')
    5. },
    6. minusOne(context) {
    7. context.commit('minusOne')
    8. }
    9. }

    接收到的context是一个对象,里边有commint方法。

     用context对象调用mutations对象里的add和minusOne方法。

    1. export default {
    2. add(state) {
    3. console.log(state)
    4. state.count += 1
    5. },
    6. minusOne(state) {
    7. state.count -= 1
    8. }
    9. }

    接收到的state是一个对象,里边有state属性,在这里就可以修改数据了。

     插值只需要用 $store.state.count 即可

     注意:也可直接使用$store.state.count进行数据修改,但又多层可以加很多逻辑代码。

    Vue-router

    基本使用

    需要写页面组件,配置路由即可。

    views/Home.vue

    1. <template>
    2. <div id="app">
    3. <h1>Apph1>
    4. <router-view>router-view>
    5. div>
    6. template>
    7. <script>
    8. export default {
    9. created() {
    10. console.log(this)
    11. }
    12. }
    13. script>

    view/Goods.vue

    1. <template>
    2. <div>
    3. <h1>商品首页h1>
    4. div>
    5. template>
    6. <script>
    7. export default {
    8. name: "Goods"
    9. }
    10. script>
    11. <style scoped>
    12. style>

    views/Login.vue

    1. <template>
    2. <div>
    3. <h1>Login页面h1>
    4. div>
    5. template>
    6. <script>
    7. export default {
    8. name: "Login"
    9. }
    10. script>
    11. <style scoped>
    12. style>

    在router/index.js里配置路由

    1. import Vue from 'vue'
    2. import VueRouter from 'vue-router'
    3. import Home from "@/views/Home";
    4. import Login from "@/views/Login";
    5. import Goods from "@/views/Goods";
    6. Vue.use(VueRouter)
    7. const routes = [
    8. {
    9. path: '/',
    10. name: 'home',
    11. component: Home
    12. },
    13. {
    14. path: '/Goods',
    15. name: 'goods',
    16. component: Goods
    17. },
    18. {
    19. name: 'login',
    20. path: '/login',
    21. component: Login
    22. },
    23. ]
    24. const router = new VueRouter({
    25. mode: 'history',
    26. base: process.env.BASE_URL,
    27. routes
    28. })
    29. export default router

    App.vue加router-view标签

    1. <template>
    2. <div id="app">
    3. <h1>Apph1>
    4. <router-view>router-view>
    5. div>
    6. template>

    在浏览器访问const routes中配置的路径,就能看到对应的页面组件了

    路由的跳转

    1. <template>
    2. <div>
    3. <h1>Home页面h1>
    4. <router-link to="login">去登陆router-link>
    5. <button @click="goShopping">去购物button>
    6. div>
    7. template>
    8. <script>
    9. export default {
    10. name: "Home",
    11. created() {
    12. console.log(this)
    13. },
    14. methods: {
    15. goShopping() {
    16. //在js中跳转
    17. this.$router.push('/goods')
    18. //window对象跳转
    19. //window.location.href='/goods'
    20. }
    21. }
    22. }
    23. script>
    24. <style scoped>
    25. style>

    路由跳转携带参数

    1. <template>
    2. <div>
    3. <h1>商品首页h1>
    4. div>
    5. template>
    6. <script>
    7. export default {
    8. name: "Goods",
    9. created() {
    10. console.log(this.$route.params)
    11. }
    12. }
    13. script>
    14. <style scoped>
    15. style>

     

     总结:在请求地址中通过?key=value的形式从this.$route.query中取值,

    1. // goods的路由配置
    2. {
    3. path: '/goods/:id',
    4. name: 'goods',
    5. component: Goods
    6. },

    以分组的形式传入数据从this.$route.params中取值。

    路由嵌套

    1. router/index.js相应的路由中

    1. {
    2. path: '/goods',
    3. name: 'goods',
    4. component: Goods,
    5. children: [
    6. {
    7. path: 'list',
    8. component: GoodList
    9. },
    10. {
    11. path: 'detail',
    12. component: GoodDetail
    13. }
    14. ]
    15. },

    2、必须在Goods组件中,写

    3、使用router-link标签跳转

    4、只会变更Goods下router-view包裹的位置

    路由守卫

    对路由进行权限控制

    前置路由守卫

    1. router.beforeEach((to, from, next) => {
    2. console.log('前置路由守卫', to, from)
    3. if (to.name == 'shoppingcart') {
    4. let name = localStorage.getItem('name')
    5. if (name) {
    6. next()
    7. } else {
    8. alert('不好意思没有权限')
    9. }
    10. } else {
    11. next()
    12. }
    13. })

    后置路由守卫

    1. router.afterEach((to,from)=>{
    2. console.log('后置路由守卫',to,from)
    3. document.title = to.name
    4. })

    =========================================================================

    vue-router路由使用

    vue-router是第三方插件,可以通过访问路由实现组件间的切换。

    vue项目创建好后,在默认情况下,根路由显示的是HomeView.vue组件,/about路由显示的是AboutView.vue组件。这个就是通过vue-router实现的。

    使用

    1.需要在根组件(App.vue)中添加标签:默认已经添加了

    <router-view/>
    

    2.创建页面组件,一般页面组件放在views文件夹内

    MyView.vue:

    1. <template>
    2. <div>
    3. <h1>这是MyView</h1>
    4. </div>
    5. </template>
    6. <script>
    7. export default {
    8. name: "MyView"
    9. }
    10. </script>
    11. <style scoped>
    12. </style>

    3.然后到router文件夹-->index.js中配置路由:除了两个默认的路由,添加自己的路由

    1. import MyView from "../views/MyView";
    2. const routes = [
    3. {
    4. path: '/',
    5. name: 'home',
    6. component: HomeView
    7. },
    8. {
    9. path: '/about',
    10. name: 'about',
    11. component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
    12. },
    13. // 配置自己的路由
    14. {
    15. path: '/my', // 路由地址
    16. name: 'my', // 别名
    17. component: MyView // 导入的组件名称
    18. }
    19. ]

    这时候访问/my路由就会显示MyView.vue组件的内容了。

    4.编写可以跳转到/my路由的标签,我这里写在App.vue内,你也可以写在其他地方。

    • 方式一:在html中写
    1. <template>
    2. <div id="app">
    3. <router-link to="/my">My</router-link>
    4. <router-view/>
    5. </div>
    6. </template>
    1. <template>
    2. <div id="app">
    3. <a href="/my">My</a>
    4. <router-view/>
    5. </div>
    6. </template>

    对比避免了不必要的重渲染,它只更新变化的部分从而减少DOM性能消耗。

    • 方式二:在js中写,编写事件触发
    this.$router.push('/my')
    
    window.location.href="/my"
    

    同样,用window.location.href会有不必要的重渲染。

  • 相关阅读:
    【网络篇】第八篇——多进程版的TCP网络程序
    【Python小项目之Tkinter应用】随机点名/抽奖工具大优化:新增选项窗口!可选是否重复点名以及随机点名!可以手动选择文件及文件类型并预览文件!
    h2database BTree 设计实现与查询优化思考
    唐人街徒步:在异国情调的纽约感受浓厚的中式气息
    机器学习——KNN算法流程详解(以iris为例)
    图论 - 二分图(染色法、匈牙利算法)
    多目标应用:基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度(MATLAB)
    AES 简介 以及 C# 和 js 实现【加密知多少系列】
    python中两个可以美化表格数据输出结果的工具,很好用
    无锁队列Disruptor使用笔记
  • 原文地址:https://blog.csdn.net/weixin_67531112/article/details/127655590