# vue 中的插槽的使用 &&vuex 的搭建与使用

# 一、插槽的使用

# 1. 为什么要使用插槽 && 使用场景

​ vue 的组件化方便了许多开发的场景,但是仅仅是父子兄弟组件的传值依然有不方便的地方,例如相同组件大体结构相同,但需要在某一块使用独立的结构,例如三个组件,第一个需要在那一块放视频,第二个需要放列表,第三个需要放置图片,这个时候,就需要我们插槽的使用

# 2. 例子

# 1. 默认插槽

1
2
3
4
5
6
7
<template>
<div class="Student">
<h3>{{title}}</h3>
<slot><li v-for="(data,index) in dataLists" :key="index">{{data}}</li></slot>
//以slot标签包裹即表示插槽位置,slot中的内容为默认内容
</div>
</template>

1
2
3
4
5
6
7
<template>
<div id="app">
<Student title='美食' :dataLists='foods'>我是撒比</Student>//以组件标签包裹需要独立的标签
<Student title='学校' :dataLists='schools'></Student>
<Student title='电影' :dataLists='movies'></Student>
</div>
</template>

# 2. 具名插槽

1
2
3
4
5
6
7
8
<template>
<div class="Student">
<h3>{{title}}</h3>
<slot slot="center"><li v-for="(data,index) in dataLists" :key="index">{{data}}</li></slot>
<slot v-slot:footer><li v-for="(data,index) in dataLists" :key="index">{{data}}</li></slot>

</div>
</template>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<template>
<div id="app">
<Student title='美食' :dataLists='foods'>我是撒比</Student>//以组件标签包裹需要独立的标签
<Student title='学校' :dataLists='schools'>
<template>
<div>
<div name="center"><div/>
<div name="footer"><div/>
<div/>
<template/>
</Student>
<Student title='电影' :dataLists='movies'></Student>
</div>
</template>

# 3. 作用域插槽:主要用于父组件需要使用子组件中的数据时

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<template>
<div class="Student">
<h3>{{title}}</h3>
<slot :games="games"><li v-for="(data,index) in dataLists" :key="index">{{data}}</li></slot>

</div>
</template>
<script>
import axios from 'axios'
export default {
name: 'Student',
data(){
return{
foods:['烧烤','小龙虾','蛋挞'],
schools:['清华','北大','浙大'],
games:['肖生客的救赎','让子弹飞','言叶之庭']
}
},
}

</script>

1
2
3
4
5
6
7
8
9
10
11
<template>
<div id="app">
<Student scope="scopeData">
<template>
<div>
<h4 v-for="s in scopeData" :key="s">{{s}}<h4/>
<div/>
<template/>
</Student>
</div>
</template>

# 二、vuex 的搭建与使用

# 1.vuex 的环境搭建

首先下载 vuex 的包,主义 3 版本是 vue2 专用,4 版本是 vue3 专用,所以我们下载时要指定 3 版本

1
npm i vuex@3

然后在 src 目录下创建 store 文件夹,然后在里面放入 index.js

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
import Vuex from 'vuex'

import Vue from 'vue'

const actions = {
jia(context, value) {
// console.log(context,value);
context.commit("JIA", value);
},
}

const mutations = {
JIA(state, value) {
state.sum += value;
}
}

const state = {
sum:0,
}

const getters = {
bigsum(state) {
return state.sum * 10;
}
}

Vue.use(Vuex)

export default new Vuex.Store({
actions,
mutations,
state,
getters
})

然后在 main.js 中引入并放入 store

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import Vue from 'vue'
import App from './App.vue'
import Vuex from 'vuex'
import store from './store/index'


Vue.config.productionTip = false

Vue.use(Vuex)

new Vue({
render: h => h(App),
store,
}).$mount('#app')

至此,store 放入全局,数据可以全局使用了

在组件中使用数据时,需要如下调用

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
<template>
<div class="add">
<h1>页面上的数字是{{sum}}</h1>
<h3>数字放大十倍后 {{bigsum}}</h3>
<button @click="add(1)">+</button>
</div>
</template>

<script>
import { mapActions, mapGetters, mapMutations, mapState } from 'vuex';
import '../store/index'
export default {
name: 'HelloWorld',
props: {
msg: String
},
methods:{
add(){
this.$store.dispatch("jia",1);
}
},
computed:{
sum(){
return this.$store.state.sum;
},
bigsum(){
return this.$store.getters.bigsum;
},
}
}
</script>

# 2. 四种方法

mapActions({a:"add",b:"delete"})

可以从 action 中批量导入动作

1
2
3
methods:{
...mapActions({add:'jia'}),
},

mapMutations({a:"add"})

可以批量从 mutation 中导入动作

1
2
3
methods:{
...mapMutations({add:'jia'}),
},

另外两个方法同理

1
2
3
4
5
computed:{
...mapState({sum:'sum'}),
...mapGetters({bigsum:'bigsum'}),

}

# 3.vuex 模块化

但当需要分类导入与引用时,就需要在 main.js 中分门别类

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
import Vuex from 'vuex'

import Vue from 'vue'
const countAbout = {
namespaced:true,
actions:{
jia(context, value) {
// console.log(context,value);
context.commit("JIA", value);
},
},
mutations: {
JIA(state, value) {
state.sum += value;
}
},
state: {
sum:0,
},
getters: {
bigsum(state) {
return state.sum * 10;
}
}
}
Vue.use(Vuex)

export default new Vuex.Store({
modules: {
countAbout,

}
})

在这样模块化之后,我们在使用方法时导入的写法需要改变

1
2
3
4
5
6
7
8
9
methods:{
...mapActions('countAbout',{add:'jia'}),
...mapMutations({})
},
computed:{
...mapState('countAbout',{sum:'sum'}),
...mapGetters('countAbout',{bigsum:'bigsum'}),

}

在使用 map 方法导入的时候,需要在导入方法与数据的前方加上类名

但是同时在类的定义的过程中,要加上

1
namespaced:true,

用于开辟命名空间