typescript - 如何正确继承 Typescript 中的父组件?
问题描述
我正在将 Vue v2 与 Typescript 一起使用,并且正在尝试扩展父类:
我的父类被调用BaseSelect
,看起来像这样:
<template>
<select :value="value" @change="$emit('change', $event.target.value)">
<option value="">default option</option>
<slot />
</select>
</template>
<script lang="ts">
import { Component, Model, Vue } from 'vue-property-decorator';
@Component({})
export default class BaseSelect extends Vue {
@Model('change', { type: String, required: false, default: '' })
private readonly value!: string
private valid = true;
validate(): boolean {
this.valid = !!this.value;
return this.valid;
}
}
</script>
我的孩子班BaseSelectGender
看起来像这样:
<template>
<base-select :value="value" @change="$emit('change', $event)">
<option value="male">I'm male</option>
<option value="female">I'm female</option>
</base-select>
</template>
<script lang="ts">
import { Component } from 'vue-property-decorator';
import { BaseSelect } from '@/components/base';
@Component({
components: { BaseSelect }
})
export default class BaseSelectGender extends BaseSelect {}
</script>
当我<base-select-gender>
在我的代码中使用时,有两个BaseSelect
组件实例(因此有两个不同的valid
变量实例):
- 由于继承而创建的第一个实例
- 由于
<base-select>
在孩子中使用而创建的第二个实例
当变量发生变化时,这会导致一些问题,valid
因为变量的错误实例反映在 DOM 中。
所以我现在的问题是:我如何扩展一个基类并使用它,或者至少在我的子组件的模板部分扩展 html 代码?
解决方案
解决方法
所以我找到了一种解决方法,我使用该ref
属性来访问“内部”组件(本template
节中的那个)的属性和方法。
这允许我手动同步我需要的所有属性(确保所需的属性没有private
修饰符)。
我的BaseSelectGender
组件现在看起来像这样:
<template>
<base-select
:value="value"
@change="$emit('change', $event)"
v-bind="{ ...$attrs, ...$props }"
ref="inner"
>
<option value="male">I'm male</option>
<option value="female">I'm female</option>
</base-select>
</template>
<script lang="ts">
import { Component } from 'vue-property-decorator';
import { BaseSelect } from '@/components/base';
@Component({
components: { BaseSelect }
})
export default class BaseSelectGender extends BaseSelect {
get inner() {
return this.$refs.inner as BaseSelect;
}
setValid(valid: boolean) {
this.valid = valid;
this.inner.setValid(valid);
}
validate(): boolean {
this.valid = this.inner.validate();
return this.valid;
}
}
</script>
专业提示:用于v-bind="{ ...$attrs, ...$props }"
将所有属性和道具从外部组件传递到内部组件。
推荐阅读
- excel - vba:从第 3 行选择表以结束 listobject
- c# - 如何解决错误:wmi_refresher.cc(129)] 无法使用 ChromeDriver 和 Selenium 添加 Win32_PerfRawData_PerfDisk_PhysicalDisk 枚举
- bucklescript - 如何使用本地包中的原因模块
- ruby-on-rails - ActiveModel::ForbiddenAttributesError in UserStepsController#update
- c - 在脚本路径前加上 `/usr/bin/env -i` 会使 system() 和 popen() 的使用安全吗?
- powerbi - DAX 无法使用“不等于”比较计算 FILTER
- java - Heroku 构建和部署 Jersey 应用程序找不到符号
- python - Python制作附加文件夹
- r - ec2 上的 sparklyr:无法访问 spark web 界面 (4040)
- html - 触摸页面顶部或底部时,滚动仅卡在 HiDpi 屏幕上