【发布时间】:2019-05-26 22:29:20
【问题描述】:
我最近开始在我的 Vue.js 项目中使用 TypeScript。对于我当前的项目(一个非常简单的聊天应用程序),我创建了一个名为 ChatParent.ts 的 TypeScript 类。它包含发送/接收消息所需的所有方法和变量。我在我的其他组件中扩展了这个类。从这些子类调用父方法可以正常工作,但是,当我监视父类中的变量(例如,username)时,更改不会反映在子组件的 DOM 中。
我尝试添加 setter/getter 方法和计算属性(例如,get methodName(): boolean),但两者都不起作用。
下面的代码来自ChatParent.ts,已经过简化。
@Component({
name: "ChatParent",
})
export default class ChatParent extends Vue {
private chatClient: new ChatClient(...);
subscribed: boolean = false;
username: string = "";
subscribe() {
const subscriptionRequest = new SubscriptionRequest();
subscriptionRequest.setUsername(username);
this.chatClient.subscribe(subscriptionRequest).on("data", data => {
this.subscribed = true;
});
}
...
}
以下来自TypeBox.vue。
<template>
<v-container pa-2>
<v-textarea
outline
label="Type message here..."
:disabled="!subscribed"
v-model="message"
></v-textarea>
</v-container>
</template>
<script lang="ts">
import {Component} from "vue-property-decorator";
import ChatParent from "@/components/ChatParent.ts";
@Component({
name: "TypeBox",
})
export default class TypeBox extends ChatParent {
message : string = "";
}
</script>
每当在subscribe(...) 方法中调用data 回调时,订阅变量都会在父类中更新,但更改不会反映在子组件中(如果subscribe 变量为真)。
我认为我对 Vue + TypeScript 的理解可能完全不正确(关于扩展类)。因此,我非常感谢一些见解。
【问题讨论】:
-
它只渲染一次,您需要强制重新渲染以更新它,最好的方法是给孩子一个密钥并在父更新时更改密钥,这将迫使孩子重新渲染。看到这里:michaelnthiessen.com/force-re-render
标签: typescript class vue.js