热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Vue3 中的 VueRouter 和 VueX详解_vue.js

VueX 提供了一个全局都可以使用的数据管理仓库,不用考虑父子传值之类的问题,并且可以跨页面传递数据,提高了可维护性,这篇文章主要介绍了Vue3 中的 Vue-Router 和 V

Vue3 中的 Vue-Router 和 VueX

先使用 vue create 指令来创建 vue 工程项目,并选择自定义,将 Router 和 VueX 勾上。

勾上以后看主入口 main.js,可以看到项目自动帮我们注册了 vue-router 和 VueX。

// main.js
createApp(App).use(store).use(router).mount('#app')

1. Vue-Router 路由的理解和使用

路由是指根据 url 的不同,展示不同的内容。

查看 src 文件夹里的 router,这就是来处理路由的地方。

其中,index.js 有关键的代码

const routes = [
{
path: '/',
name: 'home',
component: HomeView
},
{
path: '/about',
name: 'about',
// route level code-splitting
// this generates a separate chunk (about.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
}
]

定义了两个路由项。当访问根目录,就加载 HomeView 这个组件。如果访问 /about,则懒加载 AboutView 这个组件。

import(...)是异步加载路由的方法。因为如果一口气全部组件加载出来,主页的加载的性能将会很低,为了提高组件的加载性能,使用懒加载按需加载,等进入 /about 或其他的页面再加载响应部分的代码。但是异步加载代码也有相应的问题,就是去其他的页面可能会有卡顿(其实就是加载的时间分摊了)。

因此,vue-router 就是根据 url 不同来显示不同组件的特性。

现在查看根组件 App.vue,上面有关键的代码:

router-link 是跳转路由的标签,点击后就会跳转到相应的路由。

router-view 负责展示当前路由对应的组件内容。例如上面的代码,当跳转到根路径上时,router 会进行搜索,当搜索到匹配项时,便显示相应的组件 HomeView。

2. VueX 语法详解

在文首就看到了,注册了 VueX,接下来看 src 的 store 目录,这里边的 index.js 可以看到以下内容,稍后会讲。

export default createStore({
state: {
},
getters: {
},
mutations: {
},
actions: {
},
modules: {
}
})

2.1 VueX 是什么

VueX 是数据管理框架。之前的数据传递都是父子之间的传递,虽然也有 provider 之类的方法进行跨级传递,但是可维护性也不会特别高。

VueX 提供了一个全局都可以使用的数据管理仓库,不用考虑父子传值之类的问题,并且可以跨页面传递数据。提高了可维护性。

使用方法

提供数据:在 store 里的 state 里定义一些数据

// VueX 创建了一个全局唯一的仓库,用来存放全局的数据
export default createStore({
state: {
name: "John",
},
getters: {
},
mutations: {
},
actions: {
},
modules: {
}
})

在需要用数据的地方通过 this.$store 获取即可


2.2 VueX 数据修改流程

讲一下 VueX 的修改规范,因为全局的数据是不能随意更改的,因此 VueX 有一套机制流程,并不能直接用赋值的方法进行修改。

修改流程

在组件里提交一个 action 到 store,dispatch 的第一个参数是 action 名称,后面可自定义参数。

// LoginView.vue

store 感知到 action,执行 actions 下面对应的方法

actions 对应的方法 commit 信息后传递给 mutations。commit 的信息为 mutations 里的方法名。

mutations 里对应的方法执行修改数据的操作。

import { createStore } from "vuex";
// VueX 创建了一个全局唯一的仓库,用来存放全局的数据
export default createStore({
state: {
name: "John",
},
getters: {
},
mutations: {
// 4. 接收到 commit 信息后,触发对应的 mutation
change(state) {
// 5. 在 mutation 里修改数据
state.name = "Modified Name";
},
},
actions: {
// 2. 接收到 action 后执行相应的方法
change(store) {
// 3. commit 后发送给 mutations
store.commit("change");
},
},
modules: {},
});

从上面的流程来看,VueX 创建了一个全局唯一的仓库,用来存放全局的数据,同时里面设置了一系列的数据操作流程。

这流程下来有点麻烦啊,为啥不直接 commit 过去呢?同步代码看起来是如此,但是如果有异步操作的话,这些步骤就很有必要了。

注意

mutations 和 actions 里的方法第一个参数各不相同。

actions 里面第一个参数是 store,因为需要用 store.commit 方法来提交给 mutations。

mutations 里边的方法第一个参数是 state,因为 store 是用来修改 store 里 state 的方法。

可见,vue 官方在代码层面都是推荐分离的。

其他细则 mutations 里面只允许写同步代码,不许写异步代码actions 里面允许写异步操作

优点在于,将两种功能分离,mutations 里做数据的改变,actions 里做主要的逻辑书写,维护的时候会更加方便。

getter 是啥

store 里的数据有时候并不能直接拿来用,还需要经过一些小处理。一般就会想,在组件内处理不就完事了?但是呢,万一有很多的组件都有着需求呢,挨个写就不合适。getter 就相当于 store 里的 computed 属性,对 state 进行了一定的处理。

使用方法:

设置 getter

getter 接收两个参数,然后返回一个值。

state,必选,是 store 里的数据getters,可选,是 store 里的所有 getters

例如,我要计算得到大写后的 name:

// store/index.js
getters: {
upperCasedName: (state) => {
return state.name.toUpperCase();
}
},

组件获取 store 里的 getter


通过 computed 获取到 getter 后,点击按钮改变了 store 里的 name,上边显示的仍然是大写的,因为获取的是全部字母大写后的 name。

2.3 Composition API 使用 VueX

composition API 使用 useStore 获取 store 即可。


用 toRefs 解构的方法也行:



推荐阅读
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • 本文涉及源码版本为2.6.9准备工作down一份Vue源码,从package.json入手,找我们需要的代码1、package.json中的scripts,build:nodesc ... [详细]
  • vue使用
    关键词: ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • 先看看ElementUI里关于el-table的template数据结构:<template><el-table:datatableData><e ... [详细]
  • wpf+mvvm代码组织结构及实现方式
    本文介绍了wpf+mvvm代码组织结构的由来和实现方式。作者回顾了自己大学时期接触wpf开发和mvvm模式的经历,认为mvvm模式使得开发更加专注于业务且高效。与此同时,作者指出mvvm模式相较于mvc模式的优势。文章还提到了当没有mvvm时处理数据和UI交互的例子,以及前后端分离和组件化的概念。作者希望能够只关注原始数据结构,将数据交给UI自行改变,从而解放劳动力,避免加班。 ... [详细]
  • VUE中引用路径的配置
    在vue项目开发中经常引用JS、CSS、IMG文件。当项目较大时文件层级很多,导致路径很长,我们可以通过在bulidwebpack.base.conf.js设置简便的引用路径一、 ... [详细]
  • 媒介本文的前身是源自github上的项目awesome-github-vue,但由于该项目上次更新时候为2017年6月12日,许多内容早已逾期或是许多近期优异组件未被收录,所以小肆 ... [详细]
  • 1、前端代码需要引入:element.min.cssvue.min.jselement.min.jsaxios.min.js  nuget里面可添加 ... [详细]
  • 【Vue基础】监听属性watch
    Vue监听属性是watch,我们可以通过watch来响应数据的变化。代码示例: ... [详细]
author-avatar
louning5257_364
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有