当使用响应式对象 Vue 组合 api 时,我收到有关 的 Typescript 错误UnwrapRefSimple<T>。
在 内部使用数组时尤其如此ref()。
一个例子。
interface Group<T> {
name: string
items: T[]
}
export function useSomething<T extends object>({ model }: { model: T }) {
const groupsArray = ref([] as Group<T>[])
const group = {
name: 'someGroup',
items: [model],
}
groupsArray.value.push(group) // <-- this line is the problem
return {
groups: groupsArray,
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
Argument of type '{ name: string; items: T[]; }' is not assignable to parameter of …Run Code Online (Sandbox Code Playgroud) 我遇到了一个错误,其中计算未定义,我似乎无法找到如何解决这个问题,即使将其放入computed: {}
<template>
<component :is="tag" v-html="sanitizedContent" />
</template>
<script>
import { defineComponent } from "@nuxtjs/composition-api";
import DOMPurify from "isomorphic-dompurify";
export default defineComponent({
name: "HTMLContent",
sanitizedContent: computed(() => DOMPurify.sanitize(props.content)),
props: {
tag: {
type: String,
default: "div",
},
content: {
type: String,
default: "",
},
},
});
</script>
Run Code Online (Sandbox Code Playgroud) 我有一个Component A和一个嵌套的Component B。组件 A加载一个字符串列表,组件 B有一个元素,当组件 A完成加载SELECT时会填充该元素。此时应选择第一个选项。此后,当选择其他选项时,组件 B应发出带有选择数据的事件,以便组件 A “知道”选择了哪个选项。由于A应该控制B,因此该选项通过 props 传递回B。SELECTupdate
在我下面的实现中,组件 B 只接收选择的初始值,并且在加载列表时,它会成功填充,但控制属性不会更改 selectedOption 值。所以,这是行不通的。
实施这个的正确方法是什么?
组分A:
<template>
<component-b :list="list" :selected="selected" @update="onUpdate">
</template>
<script lang="ts">
import { defineComponent, ref } from 'vue';
export default defineComponent({
setup: () => {
const list = ref<string[]>([]);
const selected = ref('');
load().then(data => { // some load function returning …Run Code Online (Sandbox Code Playgroud) 在我的代码中,我已经(或希望)在某些时候使用复杂的 prop 类型。下面是我想到的示例:
enum Country {
[...]
}
interface IPerson {
firstname: string;
lastname: string;
}
interface IAddress {
street: string;
houseNo: string;
city: string;
postalCode: string;
country: number;
}
interface ITestComponentProps {
person: IPerson;
addresses: Array<IAddress>;
}
Run Code Online (Sandbox Code Playgroud)
那么我想用这一切来实现的TestComponent.vue是:
[...]
const props = defineProps<ITestComponentProps>();
[...]
Run Code Online (Sandbox Code Playgroud)
我现在期望的是某种错误消息或任何告诉我在尝试如下操作时没有提供正确结构的道具的信息:
[...]
<TestComponent :props="'foo'" />
[...]
Run Code Online (Sandbox Code Playgroud)
Vue 的文档中有如下说明:
目前不支持复杂类型和从其他文件导入类型。将来有可能支持类型导入。
有谁知道是否有解决方法来获得所需的行为或何时支持复杂类型?
typescript vue.js vuejs3 vue-composition-api vue-script-setup
我只见过每个组件有一个 onMounted() 的示例。
我想对每个功能使用 onMounted() 。
有什么问题吗?
我的组件.vue
<script setup>
import { onMounted } from 'vue';
// Feature A
onMounted(() => {
// Do something.
});
// Feature B
onMounted(() => {
// Do something.
});
</script>
Run Code Online (Sandbox Code Playgroud) vue.js vue-component vuejs3 vue-composition-api vue-script-setup
const props = defineProps({
items: {
/** @type {{new(): Color[] }} */
type: Array,
required: true,
},
selectedColor: {
type: Object,
required: true,
},
composable: {
type: Function,
required: true
}
})
Run Code Online (Sandbox Code Playgroud)
我们不使用打字稿,所以我尝试仅使用 jsdoc 和打字稿接口文件添加类型。
项目正确键入为颜色数组。如何将 selectedColor 的类型指定为 Color?另外,我如何指定可组合项的类型?
这些都不起作用
const props = defineProps({
selected: {
/** @type {Color} */
type: Object,
required: true,
},
composable: {
/** @type {function(): number} */
type: Function,
required: true
}
})
Run Code Online (Sandbox Code Playgroud)
const props = defineProps({
selected: {
/** @type {{ new(): Color}} */ …Run Code Online (Sandbox Code Playgroud) 如何在 vue 组合 api 中使用activated和deactivated保持活动事件?
我在文档中找不到任何参考资料
我正在使用 Composition API 在 VueJS 3 中创建一个库。我实现了docs 中提到的提供/注入。但是子组件中的属性仍未定义,并且在浏览器控制台中出现以下错误:
我的代码的一个非常简单的实现如下:
在项目中使用
<ThemeProvider>
<Button color="green">
ABC
</Button>
</ThemeProvider>
<script>
import { ThemeProvider, Button } from 'my-library'
export default {
name: 'SomePage',
setup() {...},
}
</script>
Run Code Online (Sandbox Code Playgroud)
ThemeProvider.js(父组件)
import { toRefs, reactive, provide, h } from 'vue'
export default {
name: 'theme-provider',
props:
theme: {
type: Object,
default: () => ({...}),
},
},
setup(props, { slots }) {
const { theme } = toRefs(props)
provide('theme', reactive(theme.value))
return () =>
h(
'div',
{...}, …Run Code Online (Sandbox Code Playgroud) 考虑这个说明性示例:
const App = {
setup() {
const name = Vue.ref("");
let firstTime = true;
const message = Vue.computed(() => {
if (firstTime) {
firstTime = false;
return "Welcome stranger";
}
return `Hello ${name.value}`;
});
return {
name,
message
}
}
};
Vue.createApp(App).mount("#root");Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/vue@next"></script>
<div id="root">
name: <input v-model="name"/> <br/>
message: {{ message }}
</div>Run Code Online (Sandbox Code Playgroud)
如您所见,message存储一个计算值,该值应该跟踪更新,name但它不是。
为什么会这样以及如何解决?