路由懒加载的配置:

const Home= () =>import('../components/Home') //使用ES6中的路由懒加载的方式
const About= () =>import('../components/About')
const User= () =>import('../components/User') const HomeNews=()=>import('../components/HomeNews')
const HomeMessage=()=>import('../components/HomeMessage') const Profile=()=>import('../components/Profile')

配置完成后,根据不同组件生成对应的js文件,在加载对应组件的同时加载自己的js文件,这样就做到了一个单个活跃组件加载的情况,对性能比较好。

关于全局导航守卫,和后置钩子

见vue源码:

beforeEach是路由跳转前执行的,afterEach是路由跳转后执行的

通过路由来切换对应组件时,各组件是会被重新创建的,也就是会调用create函数(组件创建的时候调用)和destroyed函数(组件销毁的时候调用)。

reoute-view,是viewrouter中的一个组件,而keep-alive是vue中的一个组件。keep-alive可以使被包含的组件保留状态,不会被重新渲染。

需要注意的是,当一个route-view在使用keep-alive包住的时候,组件状态是会被缓存的,create函数只会调用一次,此时是不会调用destroyed函数的,既然不会调用那么这个组件的状态是不会被重新创建的,这样一来对性能的也是比较好,总而言之就是一个对组件进行缓存的一个东西。

还有两个函数,acivated函数(组件处于活跃时调用),deactivated函数(组件处于不活跃时调用)。这里个函数只有在存在keep-alive的时候才会被调用。

那么有可能存在另外一个需求:就是我希望有的组件时需要不断重新创建然后被销毁的。

那么我们就可以在keep-alive基础上添加一些属性就可以了。

此时,这个交Profile的组件就不会被keep-alive缓存了。

这样这两个组件都不会被缓存

vue在单个组件style中引入css文件可以通过@import "路径" 这种方式去引入

常见错误:在router-view显示不出来的时候,查看路由组件注册中component不能有s!!!

浏览器报错:ncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location: "/h

解决办法:加上这一行代码:this.$router.replace('/location').catch(err =>{console.log(err)})

在脚手架2中为路径添加别名:

不过在使用的时候需要咋前面加个波浪线。并且要重新dev一下

Vuex:

手写一个vuex,也就是存在一个变量数据,所有组件共享这个数据。注意:这个数据并不是响应式的,之所以在vue中的data是响应式的是因为它依赖于vue底层的一个响应式系统。

            const sharpObj={
name:'hc'
} Vue.Prototype.sharpObj=sharpObj; Vue.component('Cpn2',{
this.sharpObj.name
}) Vue.component('Cpn1',{ }) const app = new Vue({
el:"#app", })

创建vuex的步骤,先再src中创建store文件夹,在文件夹里面创建index.js,代码如下:

import Vue from 'vue'
import Vuex from 'vuex' //1.安装插件,底层会去执行vue.install方法
Vue.use(Vuex) //2.创建对象
const store= new Vuex.Store({ }) //3.导出Store对象
export default store

挂载到main.js

挂载上去之后,它会通过 Vue.prototype.$store=store。而store这里面的值都可以让所有组件去共享,vuex管理这些store里面的值。

综上所述,所有的组件都有一个$store对象

通过this.$store.commit去提交一下,然后调用commit传过去再vuex那边定义的方法

<template>
<div id="app">
<h2>-------{{message}}-------</h2>
<h2>{{$store.state.counter}}</h2>
<button @click="addition">+</button>
<button @click="subtraction">-</button> <h2>-------HelloVuex组件数据-------</h2>
<hello-vuex></hello-vuex>
</div>
</template> <script>
import HelloVuex from './components/HelloVuex.vue' export default {
name: 'App',
components:{
HelloVuex
},
data() {
return {
message: 'app组件数据',
// counter:0
}
},
methods: {
addition(){
this.$store.commit('increment')
},
subtraction(){
this.$store.commit('decrement')
}
}, }
</script> <style>
</style>

通过devtools去调试:

关于getters的用法:

import Vue from 'vue'
import Vuex from 'vuex' //1.安装插件,底层会去执行vue.install方法
Vue.use(Vuex) //2.创建对象
const store = new Vuex.Store({
state: {
counter: 1000,
Student:[
{id:1,name:'hc',age:24},
{id:2,name:'hc1',age:30},
{id:3,name:'hc2',age:20},
{id:4,name:'hc3',age:18},
]
},
//修改state里面的东西
mutations: {
increment(state) {
state.counter++
},
decrement(state) {
state.counter--
}
},
actions: { },
//state中的数据可能会发生变异(改变),利用getters去依赖并获取它改变后的数据,这里的getters和计算属性有些类似,同样也可以缓存state单一状态树中的数据,只有再依赖值发生改变时才去重新计算
//getters:去store拿一些数据的时候,如果state中的数据需要经过变化才给别人用的,就可以再getters中去处理
getters: {
PowerCounter(state){
return state.counter * state.counter
},
//filter过滤一些数据,获取年龄大于20岁的学生
More20Stu(state){
return state.Student.filter(s=>s.age>=20)
},
//获取年龄大于20岁学生的个数
More20StuLength(state,getters){
return getters.More20Stu.length
},
MoreAgeStu(state){
return age=> state.Student.filter(s=>s.age>age)
} },
modules: { } }) //3.导出Store对象
export default store

再app.vue中使用getters:

<template>
<div id="app">
<h2>-------{{message}}-------</h2>
<h2>{{$store.state.counter}}</h2>
<button @click="addition">+</button>
<button @click="subtraction">-</button> <h2>-------App组件的Getter数据</h2>
<h2>{{$store.getters.PowerCounter}}</h2>
<h2>{{$store.getters.More20Stu}}</h2>
<h2>{{$store.getters.More20StuLength}}</h2>
<h2>{{$store.getters.MoreAgeStu(8)}}</h2> <h2>-------HelloVuex组件数据-------</h2>
<hello-vuex></hello-vuex>
</div>
</template> <script>
import HelloVuex from './components/HelloVuex.vue' export default {
name: 'App',
components:{
HelloVuex
},
data() {
return {
message: 'app组件数据',
// counter:0
}
},
methods: {
addition(){
this.$store.commit('increment')
},
subtraction(){
this.$store.commit('decrement')
}
}, }
</script> <style>
</style>

关于Mutation:

mutation携带参数(统称为:payload)的方式:

通过commit去提交一下,变更state中的数据

Mutation提交风格:

在用的时候就这么用:

Mutation类型常量是什么?

在编码过程中,有时候为了代码准确度更高,通常在变量一样的情况下选择拷贝的方式进行替换,vuex实际上也帮我们考虑了这一点。

我们可以通过定义常量统一管理这些名称一样的变量,到时候用的时候直接用常量即可。这里你也可以直接去看官方文档更加容易理解。

关于Actions:

如果通过Actions去更新State里面的值,实际上还是需要走mutation那一步,也就是说要更新state就要走mutation不能直接通过Action更新State,这样devtools是检测不到到底是怎么更新的,这也和上面那个循环图不符合!!!

那么如何去更新呢?

context参数是要带,这里的意思是上下文的意思。

可以把context看作是store,那么context也是可以用通过commit去更新的,再调用mutation的updateInfo定义的方法

要通过dispatch去更新

使用promise:这里的promise在dispatch后做了一次周转。

还有最后一个vuex五大属性的最后一个modules

在vuex的state中,我们知道这里是存储一些组件需要共享的一些变量,而我们现在是崇尚单一状态树,也就是只有一个Store对象管理vuex。那么如果变量变得很多,就会显得state里面变得比较臃肿。

所以他让我们在Store里面具体分模块

这里说明虽然state数据被模块化了,但是vue依然把它放到state中了。

需要注意的是,在使用模块里面的getters时,是可以有三个参数的,根据第三个参数可以拿到外面Store对象里的state的值!!!

模块里面的actions里面的context参数指向的是自己模块的mutations!!!而不是最外面的Store的mutaions

沉淀vue相关知识(主要还是个人积累用)的更多相关文章

  1. vue相关知识

    1.看https://www.bilibili.com/video/av27969216/?p=54,看他的就够了 https://juejin.im/post/5a5bc8c36fb9a01ca26 ...

  2. 数据库相关知识积累(sqlserver、oracle、mysql)

    数据库相关知识积累(sqlserver.oracle.mysql) 1. sqlserver :断开所有连接: (还原数据库) 1.数据库  分离 2. USE master GO ALTER DAT ...

  3. vue基础知识之vue-resource/axios

    Vue基础知识之vue-resource和axios(三)   vue-resource Vue.js是数据驱动的,这使得我们并不需要直接操作DOM,如果我们不需要使用jQuery的DOM选择器,就没 ...

  4. Vue基础知识之vue-resource和axios

    Vue基础知识之vue-resource和axios  原文链接:http://www.cnblogs.com/Juphy/p/7073027.html vue-resource Vue.js是数据驱 ...

  5. web聊天相关知识

    http相关知识 http是无状态,请求,响应模式的通信模式,就是用户每次通过浏览器点击一下页面,都需要重新与web服务器建立一下连接,且发送自己的 session id 给服务器端以使服务器端验证此 ...

  6. OpenCV&Qt学习之四——OpenCV 实现人脸检测与相关知识整理

    开发配置 OpenCV的例程中已经带有了人脸检测的例程,位置在:OpenCV\samples\facedetect.cpp文件,OpenCV的安装与这个例子的测试可以参考我之前的博文Linux 下编译 ...

  7. 微信小程序必知相关知识

    微信小程序必知相关知识 1 请谈谈微信小程序主要目录和文件的作用? project.config.json 项目配置文件,用得最多的就是配置是否开启https校验: App.js 设置一些全局的基础数 ...

  8. Redis相关知识整理

    Redis相关知识整理 1. Redis和MySQL的区别?a).mysql是关系型数据库,而redis是NOSQL,非关系型数据库.mysql将数据持久化到硬盘,读取数据慢,而redis数据先存储在 ...

  9. Vue大概知识体系和学习参考

    Vue大概知识体系和学习参考文档 官方文档学习,参考,借鉴地址:https://cn.vuejs.org/v2/guide/installation.html 菜鸟教程:https://www.run ...

随机推荐

  1. 『学了就忘』Linux软件包管理 — 43、RPM包的校验和证书

    目录 1.RPM包的校验 (1)RPM包校验基本命令 (2)校验某个系统文件是否被修改举例 (3)验证内容中8个信息的具体内容 (4)文件类型有哪些 2.RPM包的证书 (1)数字证书 (2)数字证书 ...

  2. [luogu4107]兔子和樱花

    有两个贪心:1.自底向上dfs,能删就删,这样显然是正确的,因为它最多只会造成它父亲不能删除:2.对于一个节点,优先删除其代价($c[i]+son[i]$)最大的i删除,一定最优,证明略 1 #inc ...

  3. [atAGC047F]Rooks

    如果将$x$和$y$都离散,那么删除的点的$x_{i}$和$y_{i}$必然都组成了一个完整的区间(包括过程中) 将所有点按$x$排序,再令$f[i][j][0/1]$表示当删除完区间$[i,j]$且 ...

  4. 【IDEA】头注释和方法注释

    头注释和方法注释 2020-09-08  10:16:17  by冲冲 1.头注释 ①设置 ②模板内容 /** * @ClassName ${NAME} * @Description ${DESCRI ...

  5. WinRAR下载

    https://www.win-rar.com 垃圾7Z有的解压不了.

  6. freeswitch APR库哈希表

    概述 freeswitch的核心源代码是基于apr库开发的,在不同的系统上有很好的移植性. 哈希表在开发中应用的非常广泛,主要场景是对查询效率要求较高的逻辑,是典型的空间换时间的数据结构实现. 大多数 ...

  7. 面向对象的程序设计之JS创建对象的9种模式及其优缺点

    目录 1.new Object () 2.字面式创建对象 3.工厂模式 4.构造函数模式 4.1.将构造函数当作函数 4.2.构造函数的问题 5.原型模式 5.1.理解原型对象 5.2.原型与in操作 ...

  8. 洛谷 P5233 - [JSOI2012]爱之项链(Polya 定理+递推)

    洛谷题面传送门 首先很明显题目暗示我们先求出符合条件的戒指数量,再计算出由这些戒指能够构成的项链的个数,因此考虑分别计算它们.首先是计算符合条件的戒指数量,题目中"可以通过旋转重合的戒指视作 ...

  9. 洛谷 P4099 - [HEOI2013]SAO(树形 dp)

    题面传送门 题意: 有一个有向图 \(G\),其基图是一棵树 求它拓扑序的个数 \(\bmod (10^9+7)\) \(n \in [1,1000]\) 如果你按照拓扑排序的方法来做,那恐怕你已经想 ...

  10. cookie的生命周期、访问限制、作用域、prefixes

    cookie的生命周期 cookie的生命周期可以通过两种方式定义: 会话期cookie是最简单的cookie:浏览器关闭后会被自动删除.会话期cookie不需要指定过期时间(Expires)或者有效 ...