typescript 未捕获的类型错误:emit不是vue3中的函数

mu0hgdu0  于 2023-03-04  发布在  TypeScript
关注(0)|答案(3)|浏览(429)

当我在vue 3设置代码块中编写此代码以获取answer之后的输入值时,以下是代码的一部分:

import { defineComponent } from "vue";
import { defineProps, defineEmits } from 'vue'

export default defineComponent({
  setup() {
    const props = defineProps({
      modelValue: String
    })
    const emit = defineEmits(['update:modelValue'])
    function updateValue(value: any) {
      emit('update:modelValue', value)
    }
}

应用程序运行时显示错误:

option.js:17388 Uncaught TypeError: emit is not a function
    at Proxy.updateValue (option.js:17388:13)
    at onInput._cache.<computed>._cache.<computed> (option.js:17428:78)
    at callWithErrorHandling (option.js:7359:22)
    at callWithAsyncErrorHandling (option.js:7368:21)
    at HTMLInputElement.invoker (option.js:15384:90)

我已经定义了emit,为什么还告诉我emit不是函数呢?这是我的vue3组件的完整代码:

<template>
  <div id="app">
    <div id="wrap">
      <label> 
        {{ username }}
      </label>
      <ul class="nav nav-tabs">
        <li>
          <input 
          :value="props" 
          placeholder="username" 
          v-on:input="updateValue($event.target.value)"/>
          <input v-model="password" placeholder="password" />
          <button @click="login">Login</button>
        </li>
      </ul>
    </div>
  </div>
</template>

<script lang="ts">
import { defineComponent } from "vue";
import { defineProps, defineEmits } from 'vue'

export default defineComponent({
  setup() {
    const props = defineProps({
      modelValue: String
    })
    const emit = defineEmits(['update:modelValue'])
    function updateValue(value: any) {
      emit('update:modelValue', value)
    }

    const login = () => {
      debugger
      alert(props.modelValue);
    };
    debugger

    return {
      login,
      updateValue,
      props
    };

  },
  components: {},
});
</script>

<style lang="scss" scoped>
</style>

我想从模板输入中获取用户输入的用户名。似乎没有这样工作。我应该怎么做来解决这个问题?我已经尝试将@vue/compiler-sfc升级到3. 2. 31,仍然没有解决这个问题。

ruyhziif

ruyhziif1#

defineEmitsdefineProps仅用于脚本设置,第一个示例应将props定义为option,emit是setup挂钩的第二个参数:

import { defineComponent } from "vue";

export default defineComponent({
   props:{
   modelValue: String
  },
  setup(props,{emit}) {

    function updateValue(value: any) {
      emit('update:modelValue', value)
    }
}
w46czmvw

w46czmvw2#

正如您所说的This expression is not callable error。请尝试以下操作:

import { defineComponent } from "vue";

export default defineComponent({
   props:{
   modelValue: String
  },
  setup(props,ctx) {

    function updateValue(value: any) {
      ctx.emit('update:modelValue', value)
    }
}
xqk2d5yq

xqk2d5yq3#

我有一个用于Vue3AG网格的cellRenderer,正在尝试向父对象发送事件,但是发送不起作用。

<script lang="ts">

import { defineComponent } from "vue";
import { VBtn } from 'vuetify/components/VBtn';

export default defineComponent({
  name: "MyComponent",
  components: { 'v-btn': VBtn },
  props: ['params'],
  emits: ['open-popup'],
  template: `
          <span>

            <v-btn variant="outlined" v-on:click="openPopup" class="v_btn"  >
              Resolve
</v-btn>
                
            </span>
      `,
  setup(props, ctx) {

    const openPopup = () => {
      console.log('Button clicked');
      ctx.emit('open-popup');
    }

    return {

      openPopup
    };
  },
})
</script>

<style scoped>
.v_btn {
  height: calc(var(--v-btn-height) - 5px);
}
</style>

在网格中,我正在挂接事件,但没有调用此函数。

<ag-grid-vue
        class="ag-theme-alpine"
        style="height: 400px; width: 900px"
        :columnDefs="columnDefs.value"
        :rowData="rowData"
        :defaultColDef="defaultColDef"        
        rowSelection="multiple"
        pagination="true"
        @open-popup="onOpenPopup"
      >
      </ag-grid-vue>

相关问题