【Vue3】defineExpose

【Vue3】defineExpose

defineExpose 是 Vue 3.2 引入的一个新 API,它是 <script setup> 的配套 API 之一。在 <script setup> 中,所有定义的变量和函数默认是私有的,不能从组件外部访问。如果你想让外部组件访问到 <script setup> 内定义的属性或方法,你需要使用 defineExpose 显式地暴露它们。

这是 defineExpose 的基本用法:

<script setup>
import { defineExpose } from 'vue'

// ... 定义响应式数据、函数等

defineExpose({
  a,
  b,
  c()
  // ... 这里列出你想暴露的属性和方法
})
</script>

在上面的代码中,a、b 和 c 是在 <script setup> 中定义的,通过 defineExpose 将它们暴露给父组件。这样,父组件就可以通过模板引用(ref)或者 setup() 函数的 context.expose 属性来访问这些暴露的属性和方法。

defineExpose 的引入是为了提供一种清晰的方式来控制组件的公共接口,避免所有的内部状态都被外部访问,从而增强组件的封装性。

完整实例代码

<script lang="ts" setup>
import {
    computed, onMounted, ref } from 'vue'
import {
    useAppStore } from '../store/app'
import {
    useUserStore } from '../store/user'
import GlobalSetup from './global/GlobalSetup.vue'
import GlobalContent from './global/GlobalContent.vue'
import GlobalBreadcrumb from './global/GlobalBreadcrumb.vue'
import GlobalTab from './global/GlobalTab.vue'
import GlobalMenu from './global/GlobalMenu.vue'
import GlobalMainMenu from './global/GlobalMainMenu.vue'
import GlobalMessageTab from './global/GlobalMessageTab.vue'
import {
    useRouter } from 'vue-router'
import {
    useMenu } from './composable/useMenu'
import zh_CN from '../lang/zh_CN'
import en_US from '../lang/en_US'

const appStore = useAppStore()
const userInfoStore = useUserStore()
const fullscreenRef = ref()
const visible = ref(false)
const sideWidth = computed(() =>
  appStore.collapse
    ? '60px'
    : appStore.subfield && appStore.subfieldPosition == 'side'
      ? '280px'
      : '220px'
)
const router = useRouter()

const {
   
  selectedKey,
  openKeys,
  menus,
  mainMenus,
  mainSelectedKey,
  changeMainSelectedKey,
  changeSelectedKey,
  changeOpenKeys
} = useMenu()

onMounted(() => {
   
  if (document.body.clientWidth < 768) {
   
    appStore.collapse = true
  }
  userInfoStore.loadMenus()
  userInfoStore.loadPermissions()
})

const changeVisible = () => {
   
  visible.value = !visible.value
}

const currentIndex = ref('1')

const collapse = () => {
   
  appStore.collapse = !appStore.collapse
}

const refresh = () => {
   
  appStore.routerAlive = false
  setTimeout(() => {
   
    appStore.routerAlive = true
  }, 500)
}

const logOut = () => {
   
  userInfoStore.token = ''
  userInfoStore.userInfo = {
   }
  router.push('/login')
}

const locales = [
  {
    name: 'zh_CN', locale: zh_CN, merge: true },
  {
    name: 'en_US', locale: en_US, merge: true }
]

const toUserInfo = () => {
   
  router.push('/enrollee/profile')
}

const toSystemSet = () => {
   
  router.push('/system/menu')
}

const flag = ref(false)
const changeDropdown = () => {
   
  flag.value = !flag.value
}

// DefineExpose is needed to expose local variables to parent components
defineExpose({
   
  sideWidth,
  mainSelectedKey,
  fullscreenRef,
  appStore,
  visible,
  menus,
  mainMenus,
  userInfoStore,
  currentIndex,
  selectedKey,
  openKeys,
  collapse,
  changeOpenKeys,
  changeSelectedKey,
  changeMainSelectedKey,
  changeVisible,
  refresh,
  logOut,
  locales,
  toUserInfo,
  toSystemSet,
  changeDropdown,
  flag
})
</script>

相关推荐

  1. Vue3defineExpose

    2024-02-20 21:52:01       32 阅读
  2. Vue 3 中,defineExpose 在<script setup> 中的使用

    2024-02-20 21:52:01       13 阅读
  3. vue 3

    2024-02-20 21:52:01       32 阅读
  4. <span style='color:red;'>Vue</span>-<span style='color:red;'>3</span>

    Vue-3

    2024-02-20 21:52:01      11 阅读
  5. <span style='color:red;'>Vue</span>-<span style='color:red;'>vue</span><span style='color:red;'>3</span>

    Vue-vue3

    2024-02-20 21:52:01      21 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-20 21:52:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-20 21:52:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-20 21:52:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-20 21:52:01       18 阅读

热门阅读

  1. P14 前缀和原理和特点

    2024-02-20 21:52:01       26 阅读
  2. element-plus_message.js

    2024-02-20 21:52:01       30 阅读
  3. docker安装milvus后,无法打开attu,日志报错

    2024-02-20 21:52:01       30 阅读
  4. 力扣题目-178. 分数排名

    2024-02-20 21:52:01       27 阅读
  5. 下一代Edge AI的应用初探

    2024-02-20 21:52:01       27 阅读