2

任何人都可以帮助我使用装饰器@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”的值并没有改变。难道我做错了什么?

4

1 回答 1

1

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

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

  2. 类需要有这样的@Component装饰器

@Component({/* Additional data can go in here */})
export default class MyButton extends Vue {}
  1. 这不是 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 变量会改变,但子组件不会改变。

于 2020-02-06T07:07:02.580 回答