vue3
通过 expose
可以使外部访问组件内部对象或方法,就是我们使用一个组件时有时需要直接访问这个组件的对象或方法,在options api
(选项式)默认当前实例是全部暴露的,而setup
(组合式)默认是封闭的。
<!--组件名称 exposeSetup.vue -->
<template>
<div class="itxst">
{{ state.message }}
</div>
</template>
<script setup>
import { ref, reactive } from "vue";
//定义一个变量
const state = reactive({
message: "www.itxst.com",
});
//定义一个方法
const play = () => {
state.message = "ok";
};
//暴露state和play方法
defineExpose({
state,
play,
});
</script>
app.vue
组件访问exposeSetup.vue
组件里面的方法和对象。
<!--组件名称 app.vue -->
<template>
<div class="itxst">
<!-- 使用 ref 命令 -->
<demo ref="demoComp"></demo>
<button @click="test">点击测试</button>
</div>
</template>
<script setup>
import { reactive, ref } from "vue";
import demo from "./exposeSetup.vue";
//定义一个demo组件实例,名称要和上面的ref相同
const demoComp = ref(null);
//访问demo组件的方法或对象
const test = () => {
//获取到 demo 组件的 message 数据
let msg = demoComp.value.state.message;
//执行了 demo 组件的 play方法
demoComp.value.play();
};
</script>
<!--组件名称 exposeOptionsApi.vue -->
<template>
<div class="itxst">
{{ message }}
</div>
</template>
<script>
//选项式默认当前实例是全部暴露的所以无需做任何处理
export default {
name: "demo",
//默认全部暴露 也可以通过expose控制那些需要暴露
//expose: ['play'],
data() {
return {
message: "www.itxst.com",
};
},
methods: {
play: function () {
this.message = "ok";
},
},
};
</script>
<!--组件名称 app.vue -->
<template>
<div class="itxst">
<!-- 使用 ref 命令 -->
<demo ref="demoComp"></demo>
<button @click="test">点击测试</button>
</div>
</template>
<script >
import demo from "./exposeOptionsApi.vue";
export default {
name: "app",
//注册组件
components: {
demo,
},
methods: {
test: function () {
//获取到 demo 组件的 message 数据
let msg = this.$refs.demoComp.message;
//执行了 demo 组件的 play方法
this.$refs.demoComp.play();
},
},
};
</script>
<style scoped>
.itxst {
text-align: center;
padding: 20px;
}
</style>