React还能这么玩(一)组件无render,只为传递数据

React还能这么玩(一)组件无render,只为传递数据

前言

在翻开源的React组件源码时经常看到一些用法很奇妙的,想着摘录下来,跟大家讨论下。

一、例子

参考rc-select,此处简化代码描述过程。

  • Select
class Select extends React.Component{
  // 内部的select、option都是原生的React基础组件,先用基础的来替代
  // rc-select 使用的是menu,比这个demo复杂多了
  render(){
    return (
        <select >
          {React.Children.map(this.props.children,child =>{
            const { key ,value ,children} = child.props
            return  <option key={key} value={value}>{children}</option>
          })}
        </select>
    )
  }
}
  • Option
Select.Option = class Option extends React.Component{}
  • 使用
const App = props =>{
  return (
  return (
      <div>
        <Select>
          <Select.MyOption key="ZHANG" value="ZHANG">张全蛋</Select.MyOption>
          <Select.MyOption key="TANG" value="TANG">唐马儒</Select.MyOption>
        </Select>
      </div>
  );
  )
}

二、分析

这代码就不分析了,应该算比较简单的。不一样的是思路

三、为什么要这样用

刚学React的时候肯定会写成这样

const App = props =>{
  return (
  return (
      <div>
        <Select option={[
            <Select.MyOption key="ZHANG" value="ZHANG">张全蛋</Select.MyOption>,
            <Select.MyOption key="TANG" value="TANG">唐马儒</Select.MyOption>
            ]}/>
      </div>
  );
  )
}

而我猜rc-select这样写是应该为了适配原先select-option的写法

<html>
    <body>
        <selct>
            <option value="xxxx">XXXX</option>
        </select>
    </body>
</html>

有细心(手贱)的朋友肯定发现了,rc-selectSelect.Option使用了原生的option代码居然还能跑!

import RcSelect from "rc-select";
import "rc-select/assets/index.css"
const { Option } = RcSelect
const App = props =>{
// 注意option的大小写
  return (
      <RcSelect>
        <Option value="ZHANG">张全蛋</Option>
        <option value="TANG">唐马儒</option>
      </RcSelect>
  )
}

但是会warning:

Warning: the children of `Select` should be `Select.Option` or `Select.OptGroup`, instead of `option`.

然而程序员是不care warning的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值