Vue
2021-12-20 大约 2 分钟
# Vue
# computed和watch的差别:
- vue 的计算属性有缓存,依赖与data域内数据。数据改变则重新渲染,Date.now()不依赖data域数据,所以不重新渲染
computed: {
now() {
return Date.now()
}
}
1
2
3
4
5
2
3
4
5
- 计算属性用于一个数据基于多个数据改变,watch用于多个数据基于一个数据改变
# vue生命周期
- 钩子函数
- created:data属性已初始化,el未被初始化
- beforeMount:el被初始化,但模板未被渲染
- mounted:模板渲染完成,el挂载
# vuex基本用法
- 定义
// main.js
import Vue from 'vue'
import App from './App.vue'
import store from './store'
Vue.config.productionTip = false
new Vue({
store,
render: h => h(App)
}).$mount('#app')
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
// store / index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
count:0
},
// 同步权利修改 state 的数据
mutations: {
addN(state,step){
// 变更状态
state.count += step
}
},
// 异步修改state
actions: {
// 在Actions 中不能直接修改 state中的数据,要通过 mutations修改。
addAsync(context,step) {
setTimeout(() => {
context.commit('addN',step)
}, 1000);
}
},
getters: {
showNum(state) {
return '当前最新的数量是【' + state.count + '】'
}
},
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
- 使用
IncrementN(){
this.$store.commit('addN',5)
}
handle(){
this.$store.dispatch('addAsync',5)
}
handle2(){
// 触发 actions 的第一种方式
this.$store.getters.showNum
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# vuex中模块用法
- 目录解构
- src
- components
- store
-index.js
-modules
-app.js
-bus.js
1
2
3
4
5
6
7
2
3
4
5
6
7
- app.js
const state = {
user: {}, // 需要管理的状态数据
}
const mutations = {
setUser (state, val) {
state.user = val
}
}
const getters = {}
const actions = {}
export default {
namespaced: true,
state,
mutations,
getters,
actions
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- index.js(手动引入方式)
import Vue from 'vue'
import Vuex from 'vuex'
import bus from './module/bus'
import app from './module/app'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
// 这里是根vuex状态
},
mutations: {
// 这里是根vuex状态
},
actions: {
// 这里是根vuex状态
},
modules: { // 子vuex状态模块注册
namespaced: true, // 为了解决不同模块命名冲突的问题
app,
bus
}
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- index.js(动态引入方式)
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const dynamicModules = {}
const files = require.context('.', true, /\.js$/)
const dynamicImportModules = (modules, file, splits, index = 0) => {
if (index == 0 && splits[0] == 'modules') {
++index
}
if (splits.length == index + 1) {
if ('index' == splits[index]) {
modules[splits[index - 1]] = files(file).default
} else {
modules.modules[splits[index]] = files(file).default
}
} else {
let tmpModules = {}
if ('index' == splits[index + 1]) {
tmpModules = modules
} else {
modules[splits[index]] = modules[splits[index]] ? modules[splits[index]] : {namespaced: true, modules: {}}
tmpModules = modules[splits[index]]
}
dynamicImportModules(tmpModules, file, splits, ++index)
}
}
files.keys().filter(file => file != './index.js').forEach(file => {
let splits = file.replace(/(\.\/|\.js)/g, '').split('\/');
dynamicImportModules(dynamicModules, file, splits)
})
export default new Vuex.Store({
modules: dynamicModules,
strict: process.env.NODE_ENV !== 'production'
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
- main.js
import Vue from 'vue'
import App from './App'
import router from './router'
import store from './store'
new Vue({
el: '#app',
router,
store,
render: h => h(App)
})
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11