react props和插槽
1.父子传值、插槽都是基于props
2.在react里父组件给组件传值跟具名插槽并无区别
3.子组件给父组件传值,也是利用props上定义方法,子组件拿到这个方法并传值
4.默认插槽,在子组件通过props.children获取
5.作用域插槽是通过父组件定义一个方法执行,子组件拿到这个方法并传值
import styles from './index.less'; import React from 'react'; import Son from './components/son' import { useState } from 'react' let data = { a: 'props参数', b: <div>我是具名插槽</div> } function defaultCc() { return <div>我是默认插槽</div> } function handleEmit(val: string) { console.log(val) } const HomePage: React.FC = () => { class Cc extends React.Component { state = { ...data } render() { return <div> <h3>class组件</h3> <Son a={this.state.a} b={this.state.b} scopeslot={(scope) => // (<div>{scope.name}</div>) ( scope.map((item, index) => { return <div key={index}>作用域插槽:{item.name}</div> }) ) } handleEmit={handleEmit}> {defaultCc()} </Son> </div> } } let [a, setA] = useState(data.a) let [b, setB] = useState(data.b) return ( <div className={styles.container}> <h2>props和插槽</h2> <h3>函数组件</h3> <Son a={a} b={b} scopeslot={(scope) => // (<div>{scope.name}</div>) ( scope.map((item, index) => { return <div key={index}>作用域插槽:{item.name}</div> }) ) } handleEmit={handleEmit}> {defaultCc()} </Son> <Cc></Cc> </div> ); }; export default HomePage;
import { Button } from 'antd';
import { useState } from 'react'
interface MyObject {
name: string;
}
interface Props {
a: string;
b: React.ReactNode;
children?: React.ReactNode;
scopeslot?: (scope: MyObject[]) => React.ReactNode;
handleEmit: (param: string) => void;
}
const Son: React.FC<Props> = (props) => {
console.log(props)
let [msg, setMsg] = useState([{
name: '1',
}, {
name: '2',
}, {
name: '3',
}])
return <div>
<Button type="primary" size="small">son组件</Button>
<div>{props.a}</div>
<div>{props.children}</div>
<div>{props.b}</div>
<div>{props.scopeslot?.(msg)}</div>
<Button type="primary" size="small" onClick={() => {
props.handleEmit('给父组件传值')
}}>给父组件传值</Button>
</div>
};
export default Son;

浙公网安备 33010602011771号