Vue 'expose' 选项


示例

使用 expose 选项使方法可供父组件使用。

export default {
  expose: ['createMessage'],
  data() {
    return {
      message: ' '
    }
  },
  methods: {
    createMessage(msg) {
      this.message += msg + ' '
    }
  }
}
运行示例 »

查看下面的更多示例


定义和用法

expose 选项用于列出哪些属性可通过模板引用供父组件使用。

默认情况下,所有子组件属性都可通过使用模板引用供父组件使用。

这意味着,如果子组件没有 expose 选项,而父组件在子组件上使用内置属性 ref="childComp",则父组件可以通过代码 this.$refs.childComp.message 访问子组件中的一个数据属性"message" 。 (参见示例1)

但是,当使用 expose 选项时,只有 expose 选项中列出的属性可供父级使用。 (参见示例2)


更多示例

示例 1

子组件中不使用 expose 选项,因此子组件中的所有属性都可供父组件使用。

ChildComp.vue:

<template>
  <div>
    <h3>ChildComp.vue</h3>
    <p>来自父组件的消息:</p>
    <p id="pEl">{{ message }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: ' '
    }
  },
  methods: {
    createAlert() {
      alert('这是来自子组件的警报')
    }
  }
}
</script>

<style scoped>
div {
  border: solid black 1px;
  padding: 10px;
  max-width: 350px;
  margin-top: 20px;
}
#pEl {
  background-color: lightgreen;
  font-family: 'Courier New', Courier, monospace;
}
</style>

App.vue:

<template>
  <h2>Example expose Option</h2>
  <p>The 'expose' option is not used, so all child properties are available to the parent by default, both the 'message' data property, and the 'createAlert()' method:</p>
  <button v-on:click="{ this.$refs.childComp.message += 'Hello! '; }">Write 'Hello!'</button>
  <button v-on:click="{ this.$refs.childComp.createAlert(); }">Create alert</button>
  <child-comp ref="childComp"/>
</template>
运行示例 »

示例 2

在父组件中使用子组件中的"createMessage"方法不起作用,因为子组件的 expose 选项中只列出了"message"数据属性。

ChildComp.vue:

<template>
  <div>
    <h3>ChildComp.vue</h3>
    <p>Message from parent component:</p>
    <p id="pEl">{{ message }}</p>
  </div>
</template>

<script>
export default {
  expose: ['message'],
  data() {
    return {
      message: ' '
    }
  },
  methods: {
    createMessage(msg) {
      this.message += msg + ' '
    }
  }
}
</script>

<style scoped>
div {
  border: solid black 1px;
  padding: 10px;
  max-width: 350px;
  margin-top: 20px;
}
#pEl {
  background-color: lightgreen;
  font-family: 'Courier New', Courier, monospace;
}
</style>

App.vue(突出显示的行不起作用):

<template>
  <h2>Example expose Option</h2>
  <p>Only the 'message' data property is listed in the 'expose' option, so the 'createMessage' method from the child component is not available, and will not work:</p>
  <input type="text" v-model="inpText" placeholder="Write something">
  <button v-on:click="useMet">Use exposed method</button>
  <child-comp ref="childComp"/>
</template>

<script>
export default {
  data() {
    return {
      inpText: ''
    }
  },
  methods: {
    useMet() {
      this.$refs.childComp.createMessage(this.inpText);
    }
  },
  mounted() {
    this.$refs.childComp.message = 'Initial message!';
  }
}
</script>
运行示例 »

相关页面

Vue 教程:Vue 模板参考

Vue 教程:Vue 组件

Vue 参考:Vue 'ref' 属性

Vue 参考:Vue $refs 对象