组件
全局组件和局部组件
- 全局
import Qj from './components/qj.vue'
Vue.component('QJ', Qj);
- 局部
import Jb from "./components/jb.vue";
export default {
components: {
Jb,
},
};
父子组件间传值
- 父向子传值
export default {
name: "Zi",
props: ["text"],
};
<zi :text="mgs" />
<template>
<div id="zi">
<h3>子组件</h3>
<div>{{ text }}</div>
</div>
</template>
props:{
item1:{
type:[String,Array],
required:trun,
default:"默认值",
validator:function(value){
return value.indexOf(1)
}
}
}
- 子向父传值::
通过自定义事件实现
<button @click="c">子组件按钮</button>
{
data() {
return {
list: [1, 2, 3, 4],
}
},
methods: {
c() {
this.$emit("on-change", this.list);
}
},
}
<zi @on-change="onf" />
{
data() {
return {
fList: [],
};
},
components: {
Zi,
},
methods: {
onf(data) {
this.fList = data;
},
},
}
<zi @on-change="fList.push(...$event)" />
关系型组件间传值
可以通过父组件进行数据中转
$root当前组件树根实例
$parent父实例
$children直接子组件
$refs用于获取设置了ref属性的html标签或者子组件
非关系型组件传值
Eventbus事件总线,是一个独立的事件中心,用于管理不同的组件的传值操作.通过一个新的Vue实例来管理组件传值操作
observable跨组件状态存储器
1. 创建并且导出存储的数据的对象
export default new Vue.observable({
text: "我是数据"
})
2. 哪里需要哪里用
<template>
<div class="comA">
// 使用
{{ a.text }}
</div>
</template>
<script>
import neutral from "../store/store.js";
export default {
data() {
return {
a: neutral,
};
},
};
</script>
VueX
组件插槽
- 单个插槽
<template>
<div id="ACom">
<h1>子组件A</h1>
// 插槽
<slot></slot>
</div>
</template>
<a-com>这里的内容会渲染到插槽里面</a-com>
<a-com>这里是父组件的视图模块,只能使用父组件的数据{{}}</a-com>
- 具名插槽
<template>
<div id="ACom">
<slot name="header"></slot>
<slot>默认name为default</slot>
<slot name="footer"></slot>
</div>
</template>
<a-com>
<template v-slot:header>
<h1>组件头部</h1>
</template>
<template v-slot:default>
<p>没有名字的插槽内容1</p>
<p>没有名字的插槽内容2</p>
</template>
<template v-slot:footer>
<h1>组件头部</h1>
</template>
</a-com>
- 作用域插槽
<template>
<div id="ACom">
<slot name="header" :atext="a" :btext="b"></slot>
<slot name="footer" :btext="b"></slot>
</div>
</template>
export default {
data() {
return {
a: "内容a",
b: "内容b",
};
},
};
<a-com>
<template v-slot:header="{ atext, btext }">
<h1>{{ atext }}</h1>
<h1>{{ btext }}</h1>
</template>
<template v-slot:footer="dataobj">
<h1>{{ dataobj.btext }}</h1>
</template>
</a-com>