3.2 获取props.children的值

本文介绍了如何在React中利用this.props.children属性从父组件向子组件传递内容,并展示了如何在函数式组件与类组件中获取传递过来的内容。此外,还讲解了如何正确传递数字类型的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过 this.props.children 获取父组件传过来的内容

//Column 父组件
import React, { Component } from 'react'
import ColumnItem from "./ColumnItem"

export default class Columns extends Component {
    render() {
        return (
            <div>
                <ColumnItem>
                    {/*在组件中传递 children 的内容*/}
                    <span>杂七杂八的内容</span>
                </ColumnItem>
            </div>
        )
    }
}

通过 this.props.children 获取上图 span中的内容

//ColumnItem 子组件
import React, { Component } from 'react'
import "./index.css"

export default class ColumnItem extends Component {
    render() {
        return (
            <>
                <h1>获取children中的内容:{this.props.children}</h1>
            </>
        )
    }
}

如果是函数式组件,使用 props.children 来获取;

可以通过 props 传递任何东西,像方法、字符串、数字等等;但是传递数字时需要注意要使用 {},如果不加,会当作字符串来处理。

//Columns 父组件
import React, { Component } from 'react'
import ColumnItem from "./ColumnItem"

export default class Columns extends Component {
    render() {
        return (
            <div>
                <ColumnItem x="1" y="2"></ColumnItem>{/*结果是12 */}
                <ColumnItem x={1} y={2}></ColumnItem>{/*传递数字要使用花括号*/}
            </div>
        )
    }
}
import React, { Component } from 'react'

export default class ColumnItem extends Component {
    render() {
        return (
            <>
                <h1>计算的结果是:{this.props.x + this.props.y}</h1>
            </>
        )
    }
}
<template> <div> <div class="container"> <TableCustom :columns="columns" :tableData="menuData" row-key="index" :has-pagination="false" :viewFunc="handleView" :delFunc="handleDelete" :editFunc="handleEdit"> <template #toolbarBtn> <el-button type="warning" :icon="CirclePlusFilled" @click="visible = true">新增</el-button> </template> <template #icon="{ rows }"> <el-icon> <component :is="rows.icon"></component> </el-icon> </template> </TableCustom> </div> <el-dialog :title="isEdit ? &#39;编辑&#39; : &#39;新增&#39;" v-model="visible" width="700px" destroy-on-close :close-on-click-modal="false" @close="closeDialog"> <TableEdit :form-data="rowData" :options="options" :edit="isEdit" :update="updateData"> <template #parent> <el-cascader v-model="rowData.pid" :options="cascaderOptions" :props="{ checkStrictly: true }" clearable /> </template> </TableEdit> </el-dialog> <el-dialog title="查看详情" v-model="visible1" width="700px" destroy-on-close> <TableDetail :data="viewData"> <template #icon="{ rows }"> <el-icon> <component :is="rows.icon"></component> </el-icon> </template> </TableDetail> </el-dialog> </div> </template> <script setup lang="ts" name="system-menu"> import {onMounted, ref} from &#39;vue&#39;; import { ElMessage } from &#39;element-plus&#39;; import { CirclePlusFilled } from &#39;@element-plus/icons-vue&#39;; import { Menus } from &#39;@/types/menu&#39;; import TableCustom from &#39;@/components/table-custom.vue&#39;; import TableDetail from &#39;@/components/table-detail.vue&#39;; import { FormOption } from &#39;@/types/form-option&#39;; // import { menuData } from &#39;@/components/menu&#39;; import {fetchMenuData, fetchRoleData} from &#39;@/api&#39;; import TableEdit from "@/components/table-edit.vue"; // 表格相关 let columns = ref([ { prop: &#39;title&#39;, label: &#39;菜单名称&#39;, align: &#39;left&#39; }, { prop: &#39;icon&#39;, label: &#39;图标&#39; }, { prop: &#39;index&#39;, label: &#39;路由路径&#39; }, { prop: &#39;permission&#39;, label: &#39;权限标识&#39; }, { prop: &#39;operator&#39;, label: &#39;操作&#39;, width: 250 }, ]) const getOptions = (data: any) => { // debugger return data.map(item => { const a: any = { label: item.title, value: item.id, } if (item.children) { a.children = getOptions(item.children) } return a }) } // const cascaderOptions = ref(getOptions(menuData)); // let cascaderOptions = ref([]); // 初始化为一个空的 ref 对象 // const getData = async () => { // const res = await fetchMenuData(); // cascaderOptions.value = getOptions(res.data); // 使用 .value 赋 // }; // // // 确保异步操作完成后再打印 // async function init() { // await getData(); // } // // init(); // 定义菜单选项的类型 interface MenuOption { value: string; label: string; children?: MenuOption[]; } const cascaderOptions = ref<MenuOption[]>([]); const getData = async () => { try { const res = await fetchMenuData(); cascaderOptions.value = getOptions(res.data); } catch (error) { console.error(&#39;获取菜单数据失败:&#39;, error); } }; // 在组件挂载时执行数据获取 onMounted(() => { getData(); }); console.log(&#39;cascaderOptions:&#39;,cascaderOptions) // 新增/编辑弹窗相关 let options = ref<FormOption>({ labelWidth: &#39;100px&#39;, span: 12, list: [ { type: &#39;input&#39;, label: &#39;菜单名称&#39;, prop: &#39;title&#39;, required: true }, { type: &#39;input&#39;, label: &#39;路由路径&#39;, prop: &#39;index&#39;, required: true }, { type: &#39;input&#39;, label: &#39;图标&#39;, prop: &#39;icon&#39; }, { type: &#39;input&#39;, label: &#39;权限标识&#39;, prop: &#39;permission&#39; }, { type: &#39;parent&#39;, label: &#39;父菜单&#39;, prop: &#39;parent&#39; }, ] }) const visible = ref(false); const isEdit = ref(false); const rowData = ref<any>({}); const handleEdit = (row: Menus) => { rowData.value = { ...row }; isEdit.value = true; visible.value = true; }; const updateData = () => { closeDialog(); }; const closeDialog = () => { visible.value = false; isEdit.value = false; }; // 查看详情弹窗相关 const visible1 = ref(false); const viewData = ref({ row: {}, list: [] }); const handleView = (row: Menus) => { viewData.value.row = { ...row } viewData.value.list = [ { prop: &#39;id&#39;, label: &#39;菜单ID&#39;, }, { prop: &#39;pid&#39;, label: &#39;父菜单ID&#39;, }, { prop: &#39;title&#39;, label: &#39;菜单名称&#39;, }, { prop: &#39;index&#39;, label: &#39;路由路径&#39;, }, { prop: &#39;permission&#39;, label: &#39;权限标识&#39;, }, { prop: &#39;icon&#39;, label: &#39;图标&#39;, }, ] visible1.value = true; }; // 删除相关 const handleDelete = (row: Menus) => { ElMessage.success(&#39;删除成功&#39;); } </script> <style scoped></style> 菜单未展示
最新发布
06-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值