标签: vue-composition-api

如何使用 TypeScript 处理 Vue 组合 api 中的 UnwrapRefSimple

当使用响应式对象 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)

typescript vue.js typescript-typings vue-composition-api

3
推荐指数
1
解决办法
4098
查看次数

计算未定义

我遇到了一个错误,其中计算未定义,我似乎无法找到如何解决这个问题,即使将其放入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)

debugging vue.js vuejs2 nuxt.js vue-composition-api

3
推荐指数
1
解决办法
6677
查看次数

将 ref 与 props 一起使用

我有一个Component A和一个嵌套的Component B组件 A加载一个字符串列表,组件 B有一个元素,当组件 A完成加载SELECT时会填充该元素。此时应选择第一个选项。此后,当选择其他选项时,组件 B应发出带有选择数据的事件,以便组件 A “知道”选择了哪个选项。由于A应该控制B,因此该选项通过 props 传递回BSELECTupdate

在我下面的实现中,组件 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)

vue.js vuejs3 vue-composition-api

3
推荐指数
1
解决办法
8393
查看次数

Vue 中的 DefineProps 属性的复杂类型

在我的代码中,我已经(或希望)在某些时候使用复杂的 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

3
推荐指数
1
解决办法
3855
查看次数

如果我为每个组件使用两个 onMounted() 会有问题吗?

我只见过每个组件有一个 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

3
推荐指数
1
解决办法
1084
查看次数

如何在没有 typescript 的情况下在 vue3 props 上使用 jsdoc?

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)

jsdoc vue.js vuejs3 vue-composition-api

3
推荐指数
1
解决办法
1051
查看次数

如何在 vue 组合 api 中使用激活和停用?

如何在 vue 组合 api 中使用activateddeactivated保持活动事件?

在文档中找不到任何参考资料

vue.js vue-composition-api

2
推荐指数
1
解决办法
869
查看次数

Vue 3 Composition API 提供/注入在单个文件组件中不起作用

我正在使用 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)

javascript vue.js vue-component vuejs3 vue-composition-api

2
推荐指数
2
解决办法
5603
查看次数

Vue 3:计算属性不跟踪其在组合 API 中的依赖关系

考虑这个说明性示例:

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但它不是。
为什么会这样以及如何解决?

javascript vue.js vue-component vuejs3 vue-composition-api

2
推荐指数
2
解决办法
1654
查看次数

如何在 Vue3 setup 标签中定义组件名称?

export default {}方法中,有一个name属性来定义组件名称,这在开发工具中很有用,但是新<script setup>标签中的方程式是什么?

在此处输入图片说明

vue.js vuejs3 vue-composition-api

2
推荐指数
1
解决办法
696
查看次数