vue笔记(四)注册组件,路由,vuex

官网


一、项目中的组件注册
二、路由
三、vuex


在这里插入图片描述
在这里插入图片描述


一、项目中的组件注册

1. 全局

import Loading from '@/components/loading';//封装的loading组件
Vue.component('Loading',Loading);

2. 局部

<loading/>important loading from './components/loading'components:{loading}


二、路由

1、路由配置
2、路由传参
3、接收参数和数据
4、组件内部实现路由跳转
5、路由导航

路由配置

在这里插入图片描述

import reg from './components/reg.vue'
routes = [{path:"/reg",component: reg},{path:'/product',component:xx,children:[{path: 'detail',//不加 '/',默认会 父路由path/子路由pathcomponent:xx}]}	
]

路由传参

1. 路由参数配置
{path: 'xx/:参数变量', component: xx}

let routes = [{path: '/product',component: product,children: [{path: 'detail/:aid',component: detail}]}
]

2. 页面传参:
(1)router-link to="xx/参数?a=1&b=2"

<h3>商品页</h3>
<router-link to="/product/detail/001">商品001</router-link>
<router-link to="/product/detail/002">商品002</router-link>
<router-link :to="'/product/detail/002'">商品002</router-link>

(2)router-link :to="{name:'xx', params:{}, query:{}}"
params:数据,query:参数

<router-link :to="{name: 'detail', params:{aid: '003'}, query:{a:11,b22}}"

注意:用这种方式传参时,路由配置中需要添加一个 name,指向相同 name 值的路径。

let routes = [{path: '/product',component: product,children: [{path: 'detail/:aid',name:'detail',component: detail}]}
]

接收参数和数据

{{this.$route.params/query/path}}

this.$route 返回的是当前所有的路由信息

watch:(){$route(to,from){console.log(this.$route)}
}

组件内部实现路由跳转

1. this.$router.push()

这个方法会向 history 栈添加一个新的记录,所以,当用户点击浏览器后退按钮时,则回到之前的 URL。

// 字符串
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

2. this.$router.replace()
跟 router.push 很像,唯一的不同就是,它不会向 history 添加新记录,而是跟它的方法名一样 —— 替换掉当前的 history 记录。

声明式编程式
< router-link :to="…" replace >router.replace(…)

3. router.go(n)
这个方法的参数是一个整数,意思是在 history 记录中向前或者后退多少步,类似 window.history.go(n)。

// 在浏览器记录中前进一步,等同于 history.forward()
router.go(1)// 后退一步记录,等同于 history.back()
router.go(-1)// 前进 3 步记录
router.go(3)// 如果 history 记录不够用,那就默默地失败呗
router.go(-100)
router.go(100)

路由导航

全局守卫、路由独享的守卫、组件内守卫

注意: 参数或查询的改变并不会触发进入/离开的导航守卫。 你可以通过观察 $route 对象来应对这些变化,或使用 beforeRouteUpdate 的组件内守卫。

1. 全局守卫: router.beforeEach

任何时候都会被守卫;应用场景:用户在未登录的时候进入任意页面,我们就让用户跳转到登录页面,在已登录的时候让用户正常跳转到点击的页面。demo

//常在 main.js 或 route.js 中写
router.beforeEach((to,from,next) => {next()
})

在这里插入图片描述

2. 路由独享守卫

在路由配置上直接定义 beforeEnter 守卫:

const router = new VueRouter({routes: [{path: '/foo',component: Foo,beforeEnter: (to, from, next) => {// ...}}]
})//或者
let detail = (to,from,next) =>{// ...
}
const router = new VueRouter({routes: [{path: '/foo',component: Foo,beforeEnter: detail}]
})

3. 组件内守卫

beforeRouteEnter (to, from, next) {//在渲染该组件的对应路由被 confirm 前调用// 不!能!获取组件实例 `this`// 因为当守卫执行前,组件实例还没被创建
},
beforeRouteUpdate (to, from, next) {// 在当前路由改变,但是该组件被复用时调用// 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,// 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。// 可以访问组件实例 `this`
},
beforeRouteLeave (to, from, next) {// 导航离开该组件的对应路由时调用// 可以访问组件实例 `this`
}

示例:

<script>export default {beforeRouteEnter (to,from,next){console.log("组件内部前置守卫");// 同步条件: cookie,localstorage,vuexif(true){next(true);} else {next('/login');}// 异步条件axios({url:'xxx'}).then( res =>{//通过路由的 query 传参to.query.userData = data;})}}
</script>

因为拿不到实例,所以不能直接赋值传参,可以通过 1. 路由传参; 2.next。



三、Vuex

集中式数据管理,一处修改,多处使用。适用于中大型项目;

在这里插入图片描述

图片解读:你不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地 提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好地了解我们的应用。

一句话来说:当要修改state中的值,不建议用直接赋值的方法, 这样不方便调试。
在这里插入图片描述

1. 通讯方式推荐使用: mapActions()(组件和 actions) 和 dispatch()(组件 和 actions);
this.$stroe.dispatch(类型, 数据/也叫“负载”):组件 - actions
commit:actions - mutations
mapActions
mapGetters
mapMutations
mapState

2. 简单示例1 [组件 - actions - mutations - state]:
在 store 中对 count 进行加一。
(1)准备工作,目录结构

store文件夹下
index.js
actions.js
mutations.js
getters.js
state.js

(2)代码:
main.js ↓

import store from './store'
new Vue({router,store, //注册render: h => h(App)
}).$mount('#app')

store 文件夹下 index.js ↓
类似 router 中的 index.js,可以合并在一个 index.js 一起写,也可以分成几个文件或文件夹引入到 index.js

import Vue from 'vue'
import Vuex from 'vuex'
import actions from './actions'
import mutations from './mutations'
import state from './state'
import getters from './getters'Vue.use(Vuex)export default new Vuex.Store({state,mutations,actions,getters// modules
})
文件名代码描述
state.js
let state = {count:0;
}
export default state;
state是一个仓库,常用来写初始值/默认值
app.vue
< button @click="jia">按钮+< /button> count:{{this.$store.state.count}}
methods: {jia(){this.$store.dispatch('jia'); }
}
用 $store 中的 dispatch 方法将"jia"这个类型(方法)传递到 actions 中。`dispatch(类型,负载/数据)`
actions.js
let actions = {//与mutations的通讯方法,所以mutations.js中要有increment方法// 写法: jia:function(){}// 或者jia(){}jia:(obj,payload)=>{let {commit,state} = obj;		commit("increment","数据");}//或者//jia: ({commit,state}, payload)=>{//	commit("increment", payload)//}
}
export default actions;
actions 用来处理业务逻辑。从组件中接受过来的方法,参数有两个,第一个:返回 commit,dispatch,getters等方法;第二个:负载数据,接收在组件中的dispatch传过来的数据
mutations.js
let mutations = {increment: (state,payload){state.count++;//在actions中通过commit到mutations中,逻辑在mutations中处理}
}
export default mutations;
做突变的。拿到从component或者 actions 中传过来的数据,然后修改数据,传到 state 中。有两个参数,第一个:state仓库;第二个:payload传过来的数据

(3)案例小结

  • 在组件中,用 $store.dispatch(方法A, 数据A) 将方法和数据传递到 actions 中。
  • (在 actions.js 中) 此时 actions 接收到的函数(函数名是“方法A”)携带了两个参数,一个是用来传递到 mutations 的方法,一个是由组件传递过来的 数据A。经过逻辑处理,然后使用第一个参数中的 commit(方法名B, 数据B) 将 方法B 和数据传递到 mutations 中。
  • (在 mutations.js 中) 在 mutations 中可以接收到来自 actions 传递过来的函数(函数名为“方法B”),这个函数携带了两个参数,第一个参数是 store仓库,第二个是组件传递过来的数据A或 actions 传递过来的 数据B。这里可以对在store中定义的变量值进行处理。
  • 回到组件,在组件中可以通过 this.$store.state 获取到在state中定义的变量的值。

除了上面在组件中使用 dispatch 方法,还可以在组件中直接通过 commit 方法到 mutations中,省略了actions.js这一部分的操作,但是不建议使用这个方法。

app.vue

jia(){this.$store.commit('increment','数据'); //commit方法是组件发到mutations的通讯方法
}

(4)还有 mapActions() 方法
这里如果要携带数据,直接在方法中传参 @click = "jia('数据12')"

app.vue

import {mapActions,mapGetters} from 'vuex'//methods:mapActions([类型1,类型2,类型3]) 
//mapActions调用后,返回对象,类型做key,函数做值
methods:mapActions(["jia"]) //相当于第一种方法,同时定义了同名的方法名和dispatch中的类型

当页面中既要写自己的代码,又使用到 vuex 时,使用 ... 拓展运算符和 [] 解构解析。

//下述中的 ... 是拓展运算符, 使用 [] 是解构赋值
methods: {...mapActions(["jia"]),// 将 jia()方法 映射为 `this.$store.dispatch('jia')...mapActions({add: 'increment' // 将 add()方法 映射为 `this.$store.dispatch('increment')`}),handleClick(){console.log("自己在组件中写的方法");}
}

3. 简单示例2 [组件 - getters - state]:
mapGetters 辅助函数仅仅是将 store 中的 getter 映射到局部计算属性:

文件名代码描述
state.js

let state= {num: 10
};
export default state;
在 state 中初始化变量
app.vue

< button @click="getNum">+< /button>{{num}}
//script部分
import { mapGetters } from 'vuex';
computed: mapGetters(['num']),
类似写计算属性的过程。在mapGetters中定义变量名,模板中进行使用。使用方法:`mapGetters(["类型1","类型2","类型3"])`。
getters.js

let getters= {num: (state){return state.num;}
};
export default getters;
因为在app.vue中使用了mapGetters['num'],所以在 getters.js 中需要一个 num 函数。效果与计算属性相同:
computed: {num(){return this.$store.state.num;}
}
总结:`mapGetters['类型']`与计算属性一样,都依赖元数据,且要有返回值。在 getters.js 中可以对数据进行简单的操作,比如过滤

getters.js ↓

//这个getters.js 就是将原来通过 组件-action-mutation- state 后得到数据(这里最终的数据就是mutations中的样子),然后再进行修改。
//mapGetters['count']
let getters = {count: (state) => {//当 state.count < 10 时,依次+1,>=10 时,显示 “超过10”if(state.count<10){return state.count;} else {return "超过10";}}
}
export default getters;

4. 示例3-异步处理
简单来讲,vuex 中的异步处理,就是将异步请求放到 actions 中,过程与 示例1 相似。

文件名代码
app.vue

< button @click="getData({pageNo:1, pageSize:10})">异步处理< /button>
//script部分
import { mapActions } from 'vuex';
methods: mapActions(['initDate'])
actions.js

import axios from 'axios';
let actions = {initDate: ({commit, state}, paylod) => {axios({url:'接口地址'}).then( res => { commit('initData', res.data.count); })}
};
export default actions;
mutations.js

let mutations = {initData: (state, paylod){state.count += paylod;}
};
export default mutations;

5. 个人理解 : Vuex 是一个状态管理模式,在 vuex 中的 state 中定义变量和值。类似于我们熟悉的 localStorage 和 sessionStorage。这里就拿sessionStorage和vuex来作一下对比:

名称sessionStoragevuex
存储直接在组件中: sessionStorage.setItem("key", "value");在 state 中定义 keykey的初始值 value
修改sessionStorage 的修改与它的存储类似:sessionStorage.setItem("key", "newValue");为了方便在 devtools 中调试,我们要通过 “组件 -> actions -> mutations” 这一系列步骤去修改在 state 中定义的 key值。具体方法: ①在组件中,使用this.$store.dispatch(方法名A, 数据A)mapActions(方法名A)②在 actions 中可以获取到 方法名A 中携带的 数据A。对 数据A 进行操作,操作后的数据B使用 commit(方法名B, 数据B)③在 mutations 中,以 方法名B 命名的函数可以获取到 state 中定义的 key 和它的初始值value以及 数据B。常将修改好的 数据B 赋值给 state中定义的 key
获取直接在组件中: sessionStorage.getItem("key");在组件中可以使用 this.$store.state.key 来获取值。如果是在模板中获取,为了减少对模板的操作,可以使用 mapGetters() 来获取初始值或者修改后的值。
删除①删除指定键的数据语法: sessionStorage.removeItem("key");;②删除所有数据:sessionStorage.clear();通过上面的 修改 步骤去改变 state 中定义的key,让它变成初始值。
区别用于临时保存同一窗口(或标签页)的数据,在关闭窗口或标签页之后将会删除这些数据。当页面刷新时,使用 vuex 定义的数据都会变成初始值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

#102030:在30天内运行20 10K,庆祝Java 20年

1995年5月23日是技术史上的重要时刻。 业界似乎并没有意识到当天发布的语言会在未来几年内完全改变技术的格局。 Java将在今年的同一天庆祝20岁生日。 Java 20年&#xff0c;哇&#xff01; 回顾20年前的存储器时代&#xff0c;思考一下Java的发明时间/方式。 万维网专用于精…

vue笔记(一)基本使用、数据检测

vue 官网 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。 一、基本使用 二、数据检测 一、Vue的思想 MVC【参考 nd的博客园】&#xff1a; 名称描述M&#xff08;…

js笔记(二)数组、对象、this

大标题小节一、数组1. 数组的创建、赋值、分类&#xff1b;2. 数组的简单操作&#xff08;根据索引增、查、改&#xff09;&#xff1b;3. 声明式和构造函数创建的数组的区别&#xff1b;4.数组的方法&#xff1a;push()、unshift()、splice()、pop()、shift()、slice()、sort(…

js笔记(四)内置对象Math和Date()、浏览器对象模型BOM

大标题小标题备注一、内置对象Math、Date()1. Math 数学对象;2. Date() 日期对象;常用的数学对象&#xff1a;Math.PI、abs(n)、round(n)、random()、floor(n)、ceil(n)、pow(x,y)、sqrt(n)、min(3,4,5,6)、max()、sin(弧度)、cos()、tan()&#xff1b;获取日期&#xff1a;get…

ListView展示SIM信息

首先看一下程序运行后的图片&#xff1a; 在开始写代码之前&#xff0c;看展示下程序的结构&#xff1a; 下面开始代码, 第一步&#xff0c;主程序代码&#xff1a; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundl…

js笔记(五)文档对象模型DOM

大标题小节一、DOM选择器1. id 选择器&#xff1a;getElementById("id名")&#xff1b;2. class 选择器&#xff1a;getElementByClassName("class名")&#xff1b;3. 标签选择器&#xff1a;getElementsByTagName("标签名")&#xff1b;4. name…

Flot画实时曲线

源代码&#xff1a; <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>深海的小鱼编制-PLOT</title> <script language"javascript" type"text/javascript" src"…

RHQ指标的WildFly子系统

对于RHQ-Metrics&#xff0c;我已经开始为WildFly 8编写一个子系统&#xff0c;该子系统能够在WildFly内收集指标&#xff0c;然后以固定的时间间隔&#xff08;当前为每分钟&#xff09;将其发送到RHQ-Metrics服务器。 下一张图是该发件人连续运行1.5天时结果的可视化效果的G…

Linux下实现客户端和服务器端的通信

首先&#xff0c;可以将代码复制下来放到U盘里&#xff0c;然后挂载到Linux上 挂载步骤 找到设备->USB->你U盘的名字 挂载成功 访问U盘把代码拷贝到home文件夹下&#xff0c;就可以直接进行编译。 client.c #include <stdio.h> #include <unistd.h>#include…

js笔记(八)ES6

大标题补充描述一、 ES6 中新增的声明方式&#xff1a;let、constvar、let、const之间的区别二、 ES6 字符串扩展1. 子串的识别&#xff1a;includes()、startsWith()、endsWith()&#xff1b;2. 重复字符串&#xff1a;repeat()&#xff1b;3. 字符串补全&#xff1a;padStart…

webpack css打包为一个css

1、安装 npm install extract-text-webpack-plugin --save-dev 2、项目目录&#xff1a; index文件夹下的index.css&#xff1a; body{background-color: #ccc;}.flex-div{display: flex;} index文件夹下的index2.css&#xff1a; p{text-indent: 2em;} index文件夹下的index-l…

javascript深入理解js闭包

闭包&#xff08;closure&#xff09;是Javascript语言的一个难点&#xff0c;也是它的特色&#xff0c;很多高级应用都要依靠闭包实现。 一、变量的作用域 要理解闭包&#xff0c;首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种&#xff1a;全局变量和局…

Codeforces Round #568 (Div. 2) G2. Playlist for Polycarp (hard version)

因为不会打公式&#xff0c;随意就先将就一下&#xff1f; #include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #include<vector> using namespace std; typedef long long LL; const int N55; const int MOD1e97; int…

jQuery实现页面关键词高亮

示例代码&#xff0c;关键位置做了注释&#xff0c;请查看代码&#xff1a; <html><head><title>jQuery实现页面关键词高亮</title><style type"text/css">* {margin: 0;padding: 0;}p {padding: 10px;margin-bottom: 20px;}.highligh…

简而言之,JUnit:测试隔离

作为顾问&#xff0c;我仍然经常遇到程序员&#xff0c;他们对JUnit及其正确用法的理解最多。 这使我有了编写多部分教程的想法&#xff0c;从我的角度解释了要点。 尽管存在一些有关使用该工具进行测试的好书和文章&#xff0c;但是也许可以通过本动手实践的方法来使一两个额…

Apache Camel 2.14中的更多指标

Apache Camel 2.14将于本月晚些时候发布。 由于正在解决某些Apache基础结构问题&#xff0c;因此存在一些问题。 这篇博客文章讨论的是我们添加到此版本中的新功能之一。 感谢Lauri Kimmel捐赠了骆驼指标组件&#xff0c;我们将其与出色的Codehale指标库集成在一起。 因此&am…

移动端网页宽度值(未加meta viewport标签)

移动端网页宽度值&#xff08;未加meta viewport标签&#xff09;: iphone:980px Galaxy&#xff08;盖乐世&#xff09;&#xff1a;980px Nexus&#xff1a;980px blackberry&#xff08;黑莓&#xff09;&#xff1a;980px LG&#xff1a;980px Nokia&#xff1a;980p…

简而言之:JRunner

关于JUnit测试要点的多篇教程的第四章介绍了该工具可交换测试运行器体系结构的目的&#xff0c;并介绍了一些可用的实现。 正在进行的示例通过编写参数化测试的不同可能性扩大了主题。 由于我已经发布了JUnit Rules的介绍&#xff0c;因此我决定跳过关于该主题的已宣布部分。 …

cmake how to create vs file filters

cmake how to create vs file filters 用cmakelists构建出来的工程&#xff0c;没有文件filters&#xff0c;可采用如下方法解决 set(SOURCE_LIST"lotteryTicket.cpp""stdafx.cpp""stdafx.h""test/main.cpp" )add_executable(lotteryT…

Hibernate核心接口

一、Configuration类&#xff1a;1、 作用&#xff1a;&#xff08;1&#xff09;管理hibernate配置信息&#xff08;2&#xff09;读取hibernate.cfg.xml文件&#xff08;3&#xff09;加载hibernate的驱动&#xff0c;例如&#xff1a;url,用户名&#xff08;4&#xff09;管…