使用VUE属性-装饰(或实际上其Component和Prop的VUE级组分)和VUE-chartjs-打字稿,我试图让BarChart与性-componentchartData和options。以下代码在为应用程序提供服务时实际上有效:
<script lang="ts">
import { Bar, mixins } from 'vue-chartjs-typescript'
import Vue from 'vue'
import { Component, Prop } from 'vue-property-decorator'
const { reactiveProp } = mixins
@Component({
extends: Bar,
mixins: [reactiveProp],
})
export default class BarChart extends Vue {
@Prop()
chartData: any
@Prop({default: function () { return {} }})
options!: object
mounted() {
this.renderChart(this.chartData, this.options)
}
}
</script>
Run Code Online (Sandbox Code Playgroud)
但是,它在构建应用程序时失败。我的 IDE (PyCharm Pro) 也给出了同样的错误: …
因此,我已经阅读了这篇文章几次,据我了解,我可以使用 v-model 而不是 props,将值从父组件传递到子组件,并在子组件中修改 prop 的值时自动发出事件,从而用更少的代码获得双向绑定(不需要捕获父级中发出的事件)。然而它并没有按照我认为应该的方式工作。
这是我的代码:
<template>
<!-- This is ParentComponent.vue -->
<ChildComponent v-model:documents="user.documents" />
</template>
Run Code Online (Sandbox Code Playgroud)
<script lang="ts">
// This is ParentComponent.vue
import { Vue, Options } from 'vue-class-component';
import UserClass from '@/some/place/UserClass';
import ChildComponent from '@/components/ChildComponent.vue';
@Options({
components: {
ChildComponent,
}
})
export default class ParentComponent extends Vue {
// Local state.
user: UserClass = new UserClass();
}
</script>
Run Code Online (Sandbox Code Playgroud)
<template>
<!-- This is ChildComponent.vue -->
<section v-for="document in documents" :key="document.id">
{{ document.name }}
<button @click="remove(document.id)">Delete document</button> …Run Code Online (Sandbox Code Playgroud) 我有一个 Vue.js v2.6 项目,其中包含 TypeScript v.4.3“底层”。我的问题:我找不到任何可以澄清的文档,说明在Vue 组件
中
使用是否有意义以及如何正确使用它们。
我搜索了文章、Vue.js 文档和 StackOverflow,但没有任何发现。(Vue.js 文档完全忽略了它们的存在!)access modifiers
这就是我目前在 Vue 组件中使用访问修饰符的方式:
myComponent.vue 的模板部分:
<template>
<div>
<!-- accessing some of the fields of the class here e.g. the getter -->
</div>
</template>
Run Code Online (Sandbox Code Playgroud)
myComponent.vue 的脚本部分:
<script lang="ts">
import { Vue, Component, Prop, Emit } from "vue-property-decorator";
@Component()
export default class MyComponent extends Vue {
@Prop() public readonly myPropertyVariable!: boolean;
public myVariable!: string; // accessed in template
private myInternalVariable!: boolean; // not accessed …Run Code Online (Sandbox Code Playgroud) access-modifiers typescript vue.js vuejs2 vue-class-components
我正在尝试使用 vue-class-component 和 typescript 创建一个 vue 组件(在这里找到https://github.com/vuejs/vue-class-component)。据我了解,数据是在类中定义的,正如我在下面所做的那样 - 但我收到了错误:
"[Vue warn]: Property or method "test" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property."
Run Code Online (Sandbox Code Playgroud)
这是我的实际代码的精简版本,但它仍然不起作用:
<template>
<div id="vue-test">
<input v-model="test"/>
{{test}}
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import Component from 'vue-class-component';
@Component({
})
export default class AppearanceDialogVue extends Vue {
public test: string = '100'; …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用具有以下要求的vue-class-component和vue-property-decorator在typescript中创建vuejs组件库:
对于库,我使用了最新版本的@ vue / cli来搭建项目。在该库项目中,组件运行正常。
另一方面,该应用程序正在使用webpack-setup,在这里我要使用vue组件。
通常,当我想在es6中构建基于打字稿的库时,我会使用tsc将ts文件转换为es6 js文件。但是按照这种方法,组件不知道模板。有没有一种方法可以将tsc与vue-template-compiler结合使用?
我找到了另一种方法来完成这项工作,但是我对这种方法完全不满意:
我用"vue-cli-service build --target lib --name vue-lib ./src/index.ts"
这样的方式在文档中规定的VUE-CLI-服务将创建一个UMD束和CommonJS的束在这里。在项目中,我可以将组件与//@ts-ignore上面的语句一起使用。所以我失去了声明,并且组件不在es6语法中:/
为了更好地理解我所遇到的问题,我在github上创建了一个最小的示例,您可以在这里找到:
我正在尝试使用vue-property-decorator包实现Vue Router的组件内导航保护。在底层,vue-property-decorator依赖于vue-class-component软件包。它提供了一种registerHooks方法,使您可以声明应将哪些方法视为生命周期挂钩(而不是实例方法)。
以下代码有效,输入路线时会发出警报:
import { Component, Vue } from 'vue-property-decorator';
import { router } from './Router';
@Component({
template: '<div></div>'
})
export class Foo extends Vue {
beforeRouteEnter(to, from, next){
alert('Entering Foo');
next();
}
}
router.addRoutes([
{ path: '/foo', component: Foo }
]);
Run Code Online (Sandbox Code Playgroud)
Router.ts文件包含根据docs的挂钩注册,并且确切地是:
import VueRouter from 'vue-router';
import { Component } from 'vue-property-decorator'
Component.registerHooks([
'beforeRouteEnter',
'beforeRouteUpdate',
'beforeRouteLeave'
]);
export const router = new VueRouter({
mode: 'abstract'
});
Run Code Online (Sandbox Code Playgroud)
路由器文件是在导入组件之前导入到App.ts文件中的,因此,挂钩是在导入组件之前注册的。
但是,我似乎无法将回调传递给nextmethod。给定Foo …
javascript typescript vue-router vuejs2 vue-class-components
我正在开发一个组件,当搜索栏中的文本发生变化时,该组件会查询外部 API,并且我正在尝试消除该查询,以便它只能每 2 秒执行一次。我正在尝试使用 lodash 的debounce函数来做到这一点,并且发现了多篇博客文章和有关将其与 Vue 组件一起使用的问题,但事情很复杂,因为我正在使用 Typescript 和 Vue 类组件语法(https://class- component.vuejs.org/)。老实说,我对这两者都很陌生。
我发现一篇博客文章概述了如何使用基于对象的 Vue 组件语法来执行此操作,但它不适用于类组件语法。基于对象的语法允许您将方法包装在 a 中_.debounce,如下所示:
export default {
methods: {
throttledMethod: _.debounce(() => {
console.log('I only get fired once every two seconds, max!')
}, 2000)
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法用 Vue 类组件语法做类似的事情?
以下是我的代码的相关部分(没有任何去抖动尝试):
<template>
<input
v-model="searchQuery"
@keydown="doSearch"
>
</template>
<script lang="ts">
import axios from 'axios';
import _ from 'lodash';
import { Component, Vue } from 'vue-property-decorator';
@Component
export default class FooSearch …Run Code Online (Sandbox Code Playgroud) 如下代码:
import Vue from 'vue'
import Component from 'vue-class-component'
@Component
export default class SomeComponent extends Vue {
public someText = this.$t('some.key')
}
Run Code Online (Sandbox Code Playgroud)
引发错误:
[Vue warn]: Error in data(): "TypeError: i18n is undefined"
我确保使用Vue.use(VueI18n)和初始化Vue new Vue({ /* ... */, i18n })。该i18n对象以这种方式初始化:
new VueI18n({
locale: DEFAULT_LOCALE, // imported
fallbackLocale: 'en',
messages // imported
})
Run Code Online (Sandbox Code Playgroud)
只要不立即调用翻译,例如在模板或组件方法中,它们就可以很好地工作。
这个vue-i18n问题似乎暗示存在初始化问题。
我可以通过使用方法并仅在模板中进行转换来解决此问题,但是在我的控制范围之外,有一个特定的实例会发生这样的立即调用:Vuetify input rules。
someRule = [(v) => !!v || this.$t('field.must_not_be_empty')]
Run Code Online (Sandbox Code Playgroud)
即使lazy-validation在Vuetify表单上,这些规则也会立即执行。
我确定了两种可能的解决方案:
本质上,我在 Github 上有与此和此问题相同的问题,不幸的是,它们在得到答复之前都已关闭:/
我将 Vue 与 Typscript 和 Vue 类组件一起使用。我需要做的是从 @Component 装饰器内的观察者内部访问我的(Vue-)类的方法。我知道可以使用 访问组件的数据this.$data,但是方法呢?
我的代码可以在运行时运行,但会在 vscode 中产生编译时错误和错误(“属性‘clearInfo’在类型‘Vue’上不存在。”);
@Component({
watch: {
firstMesh(newMesh) {
if (newMesh === undefined) this.clearInfo(1); // this produces the errors
else this.showMeshInfo(newMesh, 1);
},
secondMesh(newMesh) {
if (newMesh === undefined) this.clearInfo(2);
else this.showMeshInfo(newMesh, 2);
},
},
})
export default class Info extends Vue {
clearInfo(whichMesh : number) {
...
}
showMeshInfo(mesh : any, index : number) {
....
}
}
Run Code Online (Sandbox Code Playgroud) 我只是想知道哪种方式定义属性最可靠,它应该在模板中生成输出。
模板参考:
<h1>{{msg}}</h1>
Run Code Online (Sandbox Code Playgroud)
属性定义:
<script lang="ts">
import { Component, Vue } from "vue-property-decorator";
@Component
export default class Test extends Vue {
protected msg: string;
public constructor() {
super();
this.msg = 'Today\'s date ' + moment().format('YYYY/MM/DD');
}
}
</script>
Run Code Online (Sandbox Code Playgroud)
浏览器中的输出:
<h1>Today's date 2019/03/07</h1>
Run Code Online (Sandbox Code Playgroud)
模板参考:
<h1>{{msg}}</h1>
Run Code Online (Sandbox Code Playgroud)
属性定义:
export default class Test extends Vue {
protected msg: string = '';
mounted() {
this.msg = 'Today\'s date ' + moment().format('YYYY/MM/DD');
}
}
Run Code Online (Sandbox Code Playgroud)
浏览器中的输出:
<h1>Today's date 2019/03/07</h1>
Run Code Online (Sandbox Code Playgroud)
模板参考:
<h1>{{msgText}}</h1>
Run Code Online (Sandbox Code Playgroud)
属性定义: …
typescript ×10
vue.js ×7
vuejs2 ×5
javascript ×2
chart.js ×1
lodash ×1
vue-i18n ×1
vue-router ×1
vuejs3 ×1
vuetify.js ×1