VueJS Typescript - DOM 未使用超类中的变量进行更新

Posted

技术标签:

【中文标题】VueJS Typescript - DOM 未使用超类中的变量进行更新【英文标题】:VueJS Typescript - DOM not updating with variable in Super Class 【发布时间】:2019-01-11 21:41:49 【问题描述】:

基本上我有一个带有通用登录函数和变量的 BaseAuthController,然后我有一个 SignupController 和一个从 BaseAuthController 继承的 LoginController。我已经通过断点查看了变量,并且变量都被正确设置并且它们存在。问题是更改超类中的变量而不是更新 DOM

BaseAuthController.ts

import  RouterStates  from './../../../routing/RouterStates';
import Vue from "vue";

export class BaseAuthController extends Vue

// Variables
// ==================================================================

protected errorMessage: string = '';

// Login handling
// ==================================================================

/**
 * Handle loging in
 * @param firebase.auth.UserCredential respone 
 */
protected onLoginSuccess(respone: firebase.auth.UserCredential): void

    if (respone.user)
    
        let user: firebase.User = respone.user;
        if (user.emailVerified)
        
            this.$router.replace(RouterStates.APP);
        
        else
        
            user.sendEmailVerification()
                .then(() => 
                
                    this.$router.replace(RouterStates.VERIFY_EMAIL);
                )
                .catch(err => console.log(err));
        
    


SignupController.vue

<template>
<div class="signup-controller__row">
    <div class="h-group v-align-center">
        <div class="signup-controller__error-image tight"></div>
        <div class="signup-controller__error-message"> errorMessage </div>
    </div>
</div>
</template>
<script src="./SignupController.ts"></script>

SignupController.ts

export default class SignupController extends BaseAuthController 

// Variables
// ===============================================================

private confirmPassword: string = '';
private creationDetails: AccountCreationDetails = 

    email: '',
    password: ''


/**
 * Create an account
 * @returns void
 */
private onCreateAccountClick(): void


    if (this.creationDetails && this.creationDetails.email != '')
    
        if (this.creationDetails && this.creationDetails.password != '')
        
            if (this.confirmPassword != '')
            
                if (StringUtil.validateEmail(this.creationDetails.email))
                
                    if (this.creationDetails.password == this.confirmPassword)
                    
                        firebase.auth().createUserWithEmailAndPassword(this.creationDetails.email, this.creationDetails.password)
                            .then((respone: firebase.auth.UserCredential) => this.onLoginSuccess(respone))
                            .catch(() => 
                            
                                this.errorMessage = 'There was an issue creating your account';
                            );
                    
                    else
                    
                        this.errorMessage = 'Passwords do not match';
                    
                
                else
                
                    this.errorMessage = 'Please enter a valid email address';
                
            
            else
            
                this.errorMessage = 'Please confirm your password';
            
        
        else
        
            this.errorMessage = 'Please enter a password';
        
    
    else
    
        this.errorMessage = 'Please enter your email address';
        console.log(this.errorMessage);
    


【问题讨论】:

【参考方案1】:

您仅为 Vue 实例设置 data,该实例最初绑定到 DOM,但不会更新,也不会跟踪此 data 变量的更改。您需要通过 TypeScript 类上的 setter 创建 computed 数据属性,如下所示:

get computedErrorMessage() 
    return this.errorMessage;

现在在您的 SignupController.vue 文件中,引用 computedErrorMessage 属性而不是 errorMessage 变量,如下所示:

<div class="signup-controller__error-message"> computedErrorMessage </div>

computed 属性监视作为其逻辑一部分的任何data 变量,在您的情况下只是this.errorMessage;所以每当this.errorMessage 发生变化时,computedErrorMessage 就会更新,Vue 会收到通知,并将该值推送到 DOM。

【讨论】:

只是为了确认,我添加了 get computedErrorMessage() return this.errorMessage; 在我的 SignupController.ts 文件中并使用 computedErrorMessage 更新了我的 SignupController.vue 文件但是,它仍然无法正常工作吗?您是正确的,因为它获取了初始值,但从那时起它不会随 getter 更新?我只有调用 this.$forceupdate() 才能让它工作,我知道这太恶心了。 你能重现这个在 jsFiddle 之类的东西中不起作用吗?拥有完整的代码可以工作和调整将帮助您更快地找到解决方案。

以上是关于VueJS Typescript - DOM 未使用超类中的变量进行更新的主要内容,如果未能解决你的问题,请参考以下文章

VueJS 项目和 TypeScript 中的范围错误

VueJS + Typescript:类型上不存在属性

如何使用 VueJS / Typescript 导入 JSON 文件?

VueJs:服务器端渲染和 Typescript 出错

在没有 webpack 的情况下使用 VueJs 和 Typescript

VueJS/Typescript 错误:找不到模块“我的模块”或其相应的类型声明