如何在 Vue 3 组件道具中使用 type:imported Component?

Posted

技术标签:

【中文标题】如何在 Vue 3 组件道具中使用 type:imported Component?【英文标题】:How to use type: importedCompenent in Vue3 compenent props? 【发布时间】:2021-12-31 00:57:12 【问题描述】:

假设我有 2 个组件:

待办事项:

export default defineComponent(
  name: 'todoItem',
  props: 
    name: 
      type: String,
      required: true,
    ,
    isCompleted: 
      type: Boolean,
      required: false,
      default: false,
    ,
  ,
);

我想做以下事情 待办事项列表:

import TodoItem from './TodoItem.vue';

export default defineComponent(
  name: 'todoList',
  props: 
    todos: 
      type: Array<TodoItem>, // Gives an error
      required: false,
    ,
  ,
  components: 
    TodoItem,
  ,
);

有没有办法可以做到以下几点? 我可以通过执行以下操作将其“复制”为打字稿界面:

interface Todo: name: String, isCompleted: Boolean

// then do
type: Array as PropType<Todo[]>

但它是重复的代码,每次有变化时我都需要重构它。

有没有更好的办法?

【问题讨论】:

从代码中不清楚todos 到底会做什么。你能举个例子吗? 认为 例如,您可以在文件 src/typings/todo.d.ts 中定义类型(据说它会自动从 src/typings 读取,但我还没有达到我的目的已经试过了。 @EstusFlask todos 将被解构为 todoItems。 我认为您的界面是正确的。这是一个业务逻辑问题,因此您应该有某种业务逻辑数据模型。然后在最后将其转换为 TodoItem 组件。 UI 和业务逻辑是分开的,所以他们不需要在这个级别共享代码。 这个不多解释。 todos 是否包含组件本身?还是引用组件实例?请提供如何使用此道具的示例。不清楚应该如何正确输入。 【参考方案1】:

根据您提供的代码,我猜您不需要在 TodoList 组件内使用道具,因为 TodoListTodoItem 是一对父子组件。您可以尝试以下代码在它们之间传递数据:

TodoItem.vue: 无需更改。

TodoList.vue:

<template>
  <TodoItem :name="todos.name" :isCompleted="todos.isCompleted" />
</template>

import  ref  from 'vue
export default defineComponent(
  name: 'todoList',
  components: 
    TodoItem
  ,
  setup() 
    const todos = ref(
      name: '',
      isCompleted: false
    )
    return 
      todos
    
  
);

或者你可以分别传递nameisCompleted,意思是去掉todos

TodoList.vue:

<template>
  <TodoItem :name="name" :isCompleted="isCompleted" />
</template>

import  ref  from 'vue
export default defineComponent(
  name: 'todoList',
  components: 
    TodoItem
  ,
  setup() 
    const name = ref('')
    const isCompleted = ref(false)
    )
    return 
      name,
      isCompleted
    
  
);

以上是单向数据传递(从 TodoList 到 TodoItem)。如果你正在寻求双向数据传递,你可以在 TodoItem.vue 中尝试setup(props, emit)

【讨论】:

以上是关于如何在 Vue 3 组件道具中使用 type:imported Component?的主要内容,如果未能解决你的问题,请参考以下文章

如何在方法中使用 Vue 道具作为变量?

如何在组件的方法中访问 Vue JS 道具?

如何使用 vue-router 和单文件组件传递道具

Vue JS - 如何在父组件中获取道具值

如何在 vue js 中发送带有道具的方法?我在组件中有 2 种方法,但其中一种方法不起作用?

在 Vue 3 Typescript 中将道具传递给数据对象