美文网首页让前端飞
向Button.Group一样的使用组件

向Button.Group一样的使用组件

作者: 小遁哥 | 来源:发表于2020-07-05 23:32 被阅读0次
<Title color="red">1</Title>
<Title.Level color="red">12</Title.Level>

class组件中

Title.Level

import React from 'react';
interface levelProps {
  color: string;
}
interface levelState {}
class level extends React.PureComponent<levelProps, levelState> {
  constructor(props: levelProps) {
    super(props);
    this.state = {};
  }
  public render() {
    const { children, color } = this.props;
    return (
      <>
        <h1 style={{ color }}> {children}</h1>
      </>
    );
  }
}

export default level;

Title

import React from 'react';
import level from './level';
interface TitleProps {
  color: string;
}
interface TitleState {}

class Title extends React.PureComponent<TitleProps, TitleState> {
  static Level: typeof level;
  constructor(props: TitleProps) {
    super(props);
    this.state = {};
  }
  public render() {
    const { color } = this.props;
    return (
      <>
        <div style={{ color }}>1</div>
      </>
    );
  }
}
Title.Level = level;
export default Title;

注意static Level: typeof level;

在函数式组件中

Title.Level

import * as React from 'react';
export interface LevelProps {
  color: string;
}
const Level: React.FC<LevelProps> = (props, ref) => {
  const { children, color } = props;
  return <h1 style={{ color }}>{children}</h1>;
};

export default Level;

Title

import * as React from 'react';
import Level from './Level';

export interface TitleProps {
  color?: string;
  children?: any;
}

const Title: React.FC<TitleProps> & { Level: typeof Level } = (
  props,
) => {
  const { children, color } = props;
  return <div style={{ color }}>{children}</div>;
};

Title.defaultProps = {
  color: 'red',
};
Title.Level = Level;
export default Title;

注意 <TitleProps> & { Level: typeof Level }

当被 forwardRef 包裹后

Title.Level

import * as React from 'react';
export interface LevelProps {
  color: string;
}
const Level: React.FC<LevelProps> = (props, ref) => {
  const { children, color } = props;
  return <h1 style={{ color }}>{children}</h1>;
};

export default Level;

Title

import * as React from 'react';
import Level from './Level';
export interface TitleProps {
  color?: string;
  children?: React.ReactNode;
}
interface ComposeTitle
  extends React.ForwardRefExoticComponent<
    TitleProps & React.RefAttributes<React.ReactNode>
  > {
  Level: typeof Level;
}
const InnerTitle: React.ForwardRefRenderFunction<
  unknown,
  TitleProps
> = (props, ref) => {
  const { children, color } = props;
  return <div style={{ color }}>{children}</div>;
};

export const Title = React.forwardRef<unknown, TitleProps>(
  InnerTitle,
) as ComposeTitle;
Title.defaultProps = {
  color: 'red',
};
Title.Level = Level;

可以参照antd3.x、4.x的源码

相关文章

  • 向Button.Group一样的使用组件

    在class组件中 Title.Level Title 注意static Level: typeof level;...

  • Vue 组件之间传值

    1. 父组件使用props向子组件传递数据 2. 子组件使用$emit向父组件传递数据

  • Vue中父子组件如何进行通信?

    一、父子组件如何进行通信? 父组件向子组件通信使用 props, props定义在子组件中 子组件向父组件通信使用...

  • vue知识点之组件通信

    父组件 --> 子组件(1) props:父组件可以使用props向子组件传递数据父组件: 子组件: (2) 使用...

  • vue 组件传参

    父组件向子组件传参 父组件可以使用props向子组件传递数据 logoMsg:"logoMsg" props: [...

  • 【vue】组件通信

    一、父组件向子组件通信: 父组件向子组件通信使用props传递数据,示例如下: 一般当组件需要提供给别人使用时,推...

  • wx小程序-03 父、子组件传值

    父组件向子组件传值: 父组件: 子组件:如果父组件不传递text,则会使用默认的text值。 子组件向父组件传递数...

  • uniapp 父组件与 renderjs 子组件通信

    父组件向子组件通信 使用 prop 传递数据,子组件监听数据变化 子组件向子组件通信 父组件创建回调函数,子组件特...

  • 父子组件传值

    1、父组件向子组件传值 父组件通过属性绑定的方式向子组件传值 子组件通过props接收注意:子组件只可以使用父组件...

  • vue父子组件的双向绑定

    父组件可以向子组件传值,修改。同时,子组件也可以向父组件传值和修改 父组件的分析:父组件使用v-model实现双向...

网友评论

    本文标题:向Button.Group一样的使用组件

    本文链接:https://www.haomeiwen.com/subject/mmabqktx.html