javascript - 如何让 @Model 和 @Emit 在 VueJs 中与 Typescript 一起工作?

标签 javascript typescript vue.js javascript-decorators

任何人都可以帮助我使用装饰器 @Model 和 @Emit 吗? 我正在尝试更改组件中的单击顺序并使用此处的文档:https://github.com/kaorun343/vue-property-decorator 。 这是我的代码:

<template>
<button @click="onSortClick">Sort</button>
</template>  

<script lang="ts">
import Vue from "vue"; 
import { Emit, Componet, Model } from "vue-property-decorator";

export default class MyButton extends Vue {

    @Model("sort", { type: String, default: "none" }) readonly order!: string;

    @Emit("sort")
    onSortClick() {
        const nextSortOrder = {
                ascending: "descending",
                descending: "none",
                none: "ascending"
        };
        return nextSortOrder[this.order];
    }
}
</script>

但是当我单击按钮时,变量“order”的值没有改变。我做错了什么吗?

最佳答案

是的,你是。这里有一些问题。

  1. 您需要像这样导入 vue import { Vue, Component, Model, Emit } from 'vue-property-decorator;

  2. 该类需要有一个像这样的 @Component 装饰器

@Component({/* Additional data can go in here */})
export default class MyButton extends Vue {}
  • 这不是 vue 发射事件的方式。您无法更改 order 的值,因为它是同一文件中的 readonly 属性。如果您将按钮放置在另一个像这样的组件中
  • // ParentFile.vue
    
    <template>
        <my-button @sort="order = $event"></my-button>
    </template>
    
    <script lang="ts">
      import { Component, Vue, Watch } from 'vue-property-decorator';
      import MyButton from '@/components/MyButton.vue';
    
      @Component({
        components: {
          MyButton
        }
      })
      export default class Home extends Vue {
        order = 'Wow';
    
        @Watch('order')
        orderChanged(newVal: string) {
          // eslint-disable-next-line no-console
          console.log(newVal); // order will change here
        }
      }
    </script>
    

    并按照上面的方式监听发出的事件,然后父组件中的 order 变量将更改,但子组件中不会更改。

    关于javascript - 如何让 @Model 和 @Emit 在 VueJs 中与 Typescript 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58538776/

    相关文章:

    vue.js - `v-bind` 的简写,以防子组件属性名称等于传递的对象名称

    javascript - v-deep 是 Vue.js 中的反模式吗?

    javascript - 如何保持 Google Drive 侧边栏可用的持久服务器端数据?

    html - 如何去除 ionic 4 段指示器(底线)?请告诉我

    typescript - 将具有可选属性的类型强制为可索引类型

    javascript - 使用 Angular 和 Rxjs 处理多个 HTTP 请求并返回结果

    javascript - 使用服务在 Controller 之间共享对象

    javascript - 将条件存储为变量。 Javascript

    javascript - 需要从 URL 中获取最后一个单词

    javascript - vue3 + vee-validate - handleSubmit 不返回值