vue3+TS,父组件给子组件传值,但父组件显示子组件有需要的属性?

错误提示

/*

不能将类型“{ listData: any; }”分配给类型“ComponentProps<DefineComponent<{ listData: { type: ArrayConstructor; required: true; }; title: { type: StringConstructor; default: string; }; propList: { type: PropType<any[]>; required: true; }; showIndexColumn: { ...; }; showSelectColumn: { ...; }; }, ... 10 more ..., { ...; }>>”。

类型 "{ listData: any; }" 中缺少属性 "propList",但类型 "Omit<Readonly<ExtractPropTypes<{ listData: { type: ArrayConstructor; required: true; }; title: { type: StringConstructor; default: string; }; propList: { type: PropType<any[]>; required: true; }; showIndexColumn: { ...; }; showSelectColumn: { ...; }; }>> & { ...; } & VNodeProps & AllowedComponentProps & ComponentCus..." 中需要该属性。ts(2322)

table.vue(69, 5): 在此处声明了 "propList"。

*/

父组件和配置文件

因为是封装的原因,所以只要看:<page-content />组件和配置文件contentTableConfig

user.vue

<template>

<div class="user">

<page-content

:contentTableConfig="contentTableConfig"

pageName="users"

></page-content>

</div>

</template>

<script lang="ts">

import { defineComponent } from "vue";

//引入展示table组件

import PageContent from "@/components/page-content";

//引入展示table组件的数据和配置

import { contentTableConfig } from "./config/content.config";

export default defineComponent({

name: "users",

components: {

PageContent

},

setup() {

return {

contentTableConfig

};

}

});

</script>

<style scoped>

.content {

padding: 20px;

border-top: 20px solid #f5f5f5;

}

</style>

content.config.ts

export const contentTableConfig = {

title: "用户列表",

propList: [

{ prop: "name", label: "用户名", minWidth: "100" },

{ prop: "realname", label: "真实姓名", minWidth: "100" },

{ prop: "cellphonne", label: "电话号码", minWidth: "200" },

{ prop: "enable", label: "状态", minWidth: "100", slotName: "status" },

{

prop: "createAt",

label: "创建时间",

minWidth: "230",

slotName: "createAt"

},

{

prop: "updateAt",

label: "更新时间",

minWidth: "230",

slotName: "updateAt"

},

{ label: "操作", minWidth: "120", slotName: "handler" }

],

showIndexColumn: true,

showSelectColumn: true

};

子组件

page-content.vue

<template>

<div class="page-content">

<hy-table v-bind="contentTableConfig" :listData="dataList">

<!-- 1.header中的插槽 -->

<template #headerHandler>

<el-button type="primary" size="medium">新建用户</el-button>

</template>

<!-- 2.列中的插槽 -->

<template #status="scope">

<el-button

plain

size="mini"

:type="scope.row.enable ? 'success' : 'danger'"

>

{{ scope.row.enable ? "启用" : "禁用" }}

</el-button>

</template>

<template #createAt="scope">

<span>{{ $filters.formatTime(scope.row.createAt) }}</span>

</template>

<template #updateAt="scope">

<span>{{ $filters.formatTime(scope.row.updateAt) }}</span>

</template>

<template #handler>

<div class="handle-btns">

<el-button icon="el-icon-edit" size="mini" type="text"

>编辑</el-button

>

<el-button icon="el-icon-delete" size="mini" type="text"

>删除</el-button

>

</div>

</template>

</hy-table>

</div>

</template>

<script lang="ts">

import { defineComponent, computed } from "vue";

import { useStore } from "@/store";

import HyTable from "@/base-ui/table";

export default defineComponent({

components: {

HyTable

},

props: {

contentTableConfig: { //配置文件,这个要传给子组件HyTable

type: Object,

require: true

},

pageName: {

type: String,

required: true

}

},

setup(props) {

const dataList = computed(() =>

store.getters[`system/pageListData`](props.pageName)

);

return {

dataList

};

}

});

</script>

<style scoped>

.page-content {

padding: 20px;

border-top: 20px solid #f5f5f5;

}

</style>

HyTable.vue

<template>

<div class="hy-table">

<div class="header">

<slot name="header">

<div class="title">{{ title }}</div>

<div class="handler">

<slot name="headerHandler"></slot>

</div>

</slot>

</div>

<el-table

:data="listData"

border

style="width: 100%"

@selection-change="handleSelectionChange"

>

<el-table-column

v-if="showSelectColumn"

type="selection"

align="center"

width="60"

></el-table-column>

<el-table-column

v-if="showIndexColumn"

type="index"

label="序号"

align="center"

width="80"

></el-table-column>

<template v-for="propItem in propList" :key="propItem.prop">

<el-table-column v-bind="propItem" align="center">

<template #default="scope">

<slot :name="propItem.slotName" :row="scope.row">

{{ scope.row[propItem.prop] }}

</slot>

</template>

</el-table-column>

</template>

</el-table>

<div class="footer">

<slot name="footer">

<el-pagination

@size-change="handleSizeChange"

@current-change="handleCurrentChange"

:page-sizes="[100, 200, 300, 400]"

:page-size="100"

layout="total, sizes, prev, pager, next, jumper"

:total="400"

>

</el-pagination>

</slot>

</div>

</div>

</template>

<script lang="ts">

import { defineComponent, PropType } from "vue";

export default defineComponent({

props: {

listData: {

type: Array,

required: true

},

title: { //通过page-content组件传过来的contentTableConfig对象的属性会不会自动解析,是不是这儿出问题了?

type: String,

default: ""

},

propList: {

type: Array as PropType<any[]>,

required: true

},

showIndexColumn: {

type: Boolean,

default: false

},

showSelectColumn: {

type: Boolean,

default: false

}

},

emits: ["selectionChange"],

setup(props, { emit }) {

const handleSelectionChange = (value: any) => {

emit("selectionChange", value);

};

const handleSizeChange = () => {

return;

};

const handleCurrentChange = () => {

return;

};

return {

handleSelectionChange,

handleSizeChange,

handleCurrentChange

};

}

});

</script>

<style scoped lang="less">

.header {

display: flex;

height: 45px;

padding: 0 5px;

justify-content: space-between;

align-items: center;

.title {

font-size: 20px;

font-weight: 700;

}

.handler {

align-items: center;

}

}

.footer {

margin-top: 15px;

.el-pagination {

text-align: right;

}

}

</style>

演示contentTableConfig传输过程

1.通过import导入到user.vue里,给page-content.vue子组件传过去
2.组件page-content.vue继续把contentTableConfig传递给子组件HyTable.vue
3.然后HyTable.vue组件解析

显示错误的图片

vue3+TS,父组件给子组件传值,但父组件显示子组件有需要的属性?

问题出在哪儿了?


回答:

问题出在,你propList是一个必传的,你没传啊。

props: {

listData: {

type: Array,

required: true

},

title: { //通过page-content组件传过来的contentTableConfig对象的属性会不会自动解析,是不是这儿出问题了?

type: String,

default: ""

},

propList: {

type: Array as PropType<any[]>,

required: true // 你这个也是个true啊

},

showIndexColumn: {

type: Boolean,

default: false

},

showSelectColumn: {

type: Boolean,

default: false

}

},

你在子组件props里面写 propList 的 required 为 true,但你在父组件中:

<hy-table v-bind="contentTableConfig" :listData="dataList">

缺少 propList 属性。

以上是 vue3+TS,父组件给子组件传值,但父组件显示子组件有需要的属性? 的全部内容, 来源链接: utcz.com/p/933021.html

回到顶部