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;

 

posted on 2024-04-07 11:35  sss大辉  阅读(54)  评论(0编辑  收藏  举报

导航