我有一个需要触发事件的 vue 可组合项。我天真地设置如下:
*// composable.js*
import { defineEmits } from "vue";
export default function useComposable() {
// Vars
let buffer = [];
let lastKeyTime = Date.now();
const emit = defineEmits(["updateState"]);
document.addEventListener("keydown", (e) => {
// code
emit("updateState", data);
}
// *App.vue*
<template>
<uses-composables
v-show="wirtleState.newGame"
@updateState="initVars"
></uses-composables>
</template>
<script setup>
const initVars = (data) => {
//code here
}
// usesComposable.vue
<template>
<button @click="resetBoard" class="reset-button">Play Again</button>
</template>
<script setup>
import { defineEmits } from "vue";
import useEasterEgg from "@/components/modules/wirdle_helpers/useEasterEgg.js";
useEasterEgg();
</script>
我得到的错误是“Uncaught TypeError:emit is not a function useEasterEgg.js:30:11
很明显你不能在.js 文件中使用defineEmits。我在 Vue 文档中没有看到他们专门使用此场景的任何地方。除了使用 $emits 之外,我没有看到任何其他方法可以做到这一点,但这是在我的可组合项没有的模板中调用的。非常感谢任何启发。
您可以从可组合项发出事件,但需要使用
context
知道应该从哪里触发事件,可以从传递给设置函数的第二个 prop 访问该事件:https://vuejs.org/api /composition-api-setup.html#setup-context
可组合:
export default function useComposable(context) {
context.emit("some-event")
}
组件脚本:
<script>
import useComposable from "./useComposable"
export default {
emits: ["some-event"],
setup(props, context) {
useComposable(context)
}
}
</script>
要在脚本设置中使用它,我发现最好的方法是首先声明 DefineEmit,然后将其分配给 const,然后将其作为参数传递给可组合项:
const emit = defineEmit(['example']
useMyComposable(emit);
function useMyComposable(emit){
emit('example')
}
您无法以这种方式访问发射,正如文档所说:defineProps和defineEmits是仅在脚本设置内可用的编译器宏。 https://vuejs.org/api/sfc-script-setup.html
我不完全确定你想要实现什么,但你可以使用 vue-use 可组合库来听击键https://vueuse.org/core/onkeyrinkle/
Lx4
我在此链接中找到了 3 种发射方法的全面概述:https://weekly-vue.news/issues/105 这些方法是:
文档中不鼓励使用方法 3。
方法 1 可读性最强、最简单,但对于我的目的来说太长了。
我使用了方法 2,以便我的组件清楚地表明它发出哪个事件:
// in the component:
const emit = defineEmits(['delete']);
const { openConfirmDelete } = useConfirmDelete(emit);
// in the composable:
type Emit = (event: 'delete', ...args: any[]) => void;
export function useConfirmDelete(emit: Emit) {
// function body
emit('delete', args);
// etc.
}