Skip to content

方式一:使用teleport;

parent

html
<tempalte>
	<div id="parent"></div>
	
	<>
		...
		<Child />
		...
	</>
</template>

Child

html
<Teleport to="#parent">
	some content...
</Teleport>

方式二:自定义hook

hooks: useRegistryEmit

javascript
function useRegistryEmit(emits) {
  const emitRegistry = payload => {
    emits('registry', payload)
  }

  // 路由切换时重置
  onBeforeRouteLeave(() => {
    emits('registry', null)
  })
  return { emitRegistry }
}

父组件中

html
<el-main class="p-0 flex flex-col">
  <div class="flex justify-between px-12 shadow-md items-center z-[1000]">
    ...
    <div>
      <Component :is="navRightRender" />
    </div>
  </div>
  <RouterView v-slot="{ Component }">
    <div class="h-auto flex-grow-1 overflow-y-auto">
	    // Children
      <Component :is="Component" @registry="registry" />
    </div>
  </RouterView>
</el-main>

<script setup>
const navRightRender = ref(null)

function registry(payload) {
  navRightRender.value = payload
}
</script>

子组件中使用hook

javascript
const emits = defineEmits(['registry'])
const { emitRegistry } = useRegistryEmit(emits)

// 调用时机:onCreated/onMounted
emitRegistry(() =>
  h(
    ElButton,
    {
      type: 'primary',
      size: 'small',
      onClick: () => {
        ...
      },
    },
    '新增'
  )
)

Released under the MIT License.