子组件 把数据传递到父组件之上
逆向传值 默认是不被允许的 我们需要借助一些其他知识来完成逆向传值(自定义事件辅助)
1.必须在子组件中通过事件来触发
zizizzizi
2 在子组件的函数中 使用自定义事件($emit)抛出要传递的数据
zizizzizi
3.在父组件中使用自定义事件 并且接受子组件的数据
fuffufufufufufufufuf
详情请见下方ref绑定到组件之上
a组件逆向传值给父组件 父组件在正向传值给b组件
中央事件总线作用是完成同胞传值 中央事件总线eventBus就是凌驾在兄弟组件之上的一个空的vue实例 这个实例只要就是建立起了多个兄弟组件之间的数据通信桥梁
1.在src下新建文件夹与文件用来保存中央事件总线这个空的vue实例
import Vue from "vue"
export default new Vue
2.发送
demoaaaaaaaaaaaaa
3.接受
democccccccccccc--{{text}}
vue是单向数据流(数据只能从一个层级一级一级的向下或者向上传递) 在多个层级传值的时候是非常麻烦的 所以为了解决这个问题 我们可以时使用vuex来进行跨层级传值
vuex 是vue中的一个状态(数据 变量)管理工具 可以通过vuex把整个项目的数据 统一的保存在里面 哪个组件用 那个组件直接就去取,简化了数据传递的方式
在创建项目的时候 选中vuex选项即可
在新建好的项目中会有一个store的文件夹 这个文件夹就是用来存放vuex的所有代码的 他就是数据仓库文件夹
在vuex中数据全部放到state中
创建数据
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {//数据源
text:"我是字符串",
num:66666,
bool:true,
arr:[11111,22222,3333,4444],
obj:{
name:"xixi",
age:18
}
},
mutations: {
},
getters:{
},
actions: {
},
modules: {
}
})
使用数据 this.$store.state.xxx
<template>
<div class="about">
<!-- 使用state数据 -->
<h1>This is an about page---{{this.$store.state.text}}</h1>
</div>
</template>
因为数据后期可能非常多 所以放在一起就会到值后期很难以维护所以我们需要用模块来进行管理
1.在store文件夹下新建文件夹 (modules) 与文件来容纳拆分的模块
let aboutm={
state: {//数据源
text:"我是字符串",
},
mutations: {
},
getters:{
},
actions: {
},
}
export default aboutm
2.把模块注入到vuex中
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
// 1.引用拆分的模块
import aboutm from "./modules/aboutm.js"
import homem from "./modules/homem.js"
import hwm from "./modules/hwm.js"
export default new Vuex.Store({
modules: {
// 2.调用
aboutm,
homem,
hwm
}
})
3.在组件中使用的时候不要忘了点模块名 才能取出模块中的数据
<template>
<div class="about">
<!-- 使用state this.$store.state.模块名.数据 -->
<h1>This is an about page---{{this.$store.state.aboutm.text}}</h1>
</div>
</template>
getters就是vuex中的计算属性(依赖一个状态数据 当数据改变的时候 getters会重新计算这个数据并且返回计算出来之后的新结果)
getters是vuex的计算属性 他和组件的computed有啥区别?
getters就是类似于全局的计算属性 因为使用getters处理的数据 可以在任何地方都直接使用
computed类似于局部的 他只能在定义的组件内进行使用
语法:
getters:{
处理之后的新变量(state){
return 你的处理逻辑
}
},
let aboutm={
state: {//数据源
text:"abcdefghijk",
},
mutations: {
},
getters:{
newtext(state){
return state.text.toUpperCase()
}
},
actions: {
},
}
export default aboutm
获取getters数据
this.$store.getters.数据
<template>
<div class="about">
<!-- 使用state this.$store.state.模块名.数据 -->
<h1>This is an about page---{{this.$store.state.aboutm.text}}</h1>
<h1>转成大写了---{{this.$store.getters.newtext}}</h1>
</div>
</template>
mutations的作用就是用来修改state数据的 因为在vuex中state的数据不能直接修改而是必须通过mutations来进行修改
mutations中是一个个修改方法 每一个方法就是一个修改的操作/动作
要是想触发mutations中修改的方法动作 必须通过commit()来触发
记住: 修改state的数据 必须通过commit调用mutations来进行修改
1.组件内通过commit调用修改动作
This is an about page---{{this.$store.state.aboutm.text}}
转成大写了---{{this.$store.getters.newtext}}
2.在vuex中编写修改的mutations动作
let aboutm={
state: {//数据源
text:"abcdefghijk",
},
mutations: {
xiaoming(state,payload){
state.text=payload.val
}
},
getters:{
newtext(state){
return state.text.toUpperCase()
}
},
actions: {
},
}
export default aboutm
在vuex中如果项进行异步操作(异步请求)必须在actions中进行触发
actions中是一个个的异步触发方法 每一个方法就是一个异步触发方法
actions必须通过 dispatch()调用
1.在组件内 通过dispatch触发vuex中的异步触发器
funb(){
// 2.通过dispatch来调用vuex的actions异步触发器
// this.$store.dispatch("你要用的触发器名字",{key:你要传递的数据})
this.$store.dispatch("axioslink",{key:"/data/userlist/mockdata"})
}
2.在vuex中创建对应的actions
actions: {
axioslink(context,payload){
你的数据请求
}
},
用来混合父组件与子组件自己的模板(就是从组件外部向组件内部中传入dom)
fufufuffufufufuf
你好么么哒
我就是想让这个插入的dom内容显示怎么办?
(1)在子组件中设置slot
zizizizizizizizzz
(2)就可以直接往设置了slot的组件中插入dom
fufufuffufufufuf
你好么么哒1
你好么么哒2
你好么么哒3
你好么么哒4
你好么么哒5
你好么么哒6
具名槽口 就是带有名字的槽口 给slot槽口起个名字方便后期管理
语法:
1.定义slot
zizizizizizizizzz
2.使用 在dom上使用 slot属性=“你要插入槽口的名字”即可插入
fufufuffufufufuf
你好么么哒1
你好么么哒2
你好么么哒3
你好么么哒4
你好么么哒5
你好么么哒6