首页 > 其他分享 >React.Children.map的用法

React.Children.map的用法

时间:2023-11-15 20:23:49浏览次数:32  
标签:map const searchVal React props Children 页面

React.Children用很多用法,如下图,经常会用到的是toArray(),具体用法可以自行了解,这里记录下map()的用法和使用到的场景。

1. 用法:React.Children.map接收2个参数,第一个是所有子元素,第二个是个回调,可以对每个子元素进行处理,然后返回处理后的子元素。 2. 使用场景:子元素(也可理解为子组件)有相同的处理逻辑或者数据(脑里突然闪出useContext和useReducer,可以尝试看看);子元素是不确定的,无法使用传统的父子组件(准确说,这里的子元素是个页面,有七八个页面需要增加相同的业务需求,这个做法有点类似网站的顶部导航这类公共布局,因此第一个想法就是定义一个Layout,使用React.Children.toArray,然后在需要处理的页面上最外层加上<Layout>...</Layout>,但是这样没法对子元素页面进行操作,所以采用React.Children.map来实现子元素页面想要的功能(这里用到React.cloneElement)。脑里又闪出新的想法,将这七八个页面路由入口都放在Layout上,通过路径决定子元素使用哪个页面组件,这样就是传统的父子组件传递数据,或许更容易理解)。 3. 实现代码:
// Layout.tsx
interface LayoutProps {
  children: React.ReactElement | React.ReactElement[];
}

function Layout(props: LayoutProps) {
  const location = useLocation();
  const pathname = location.pathname;

  const sessionKey = `Filter_${pathname}`;
  // 获取缓存的数据
  const searchStr = sessionStorage.getItem(sessionKey);
  // 即用即销
  sessionStorage.removeItem(sessionKey);
  // 这里想要实现,点击前往其他页面前,将本页面的搜索条件缓存,便于下次回到本页面时使用
  const handleClick = (searchVal: SearchValProps, id: string) => {
    if (searchVal && Object.keys(searchVal).length > 0) {
      const searchStr = JSON.stringify(searchVal);
      sessionStorage.setItem(sessionKey, searchStr);
    }
    window.location.href = linkUrl(jobId);
  };
  return (
    <div className="template-layout">
      {React.Children.map(props.children, (child: React.ReactElement) =>
        // cloneElement第二个参数将作为child的props传入
        React.cloneElement(child, {
          searchVal: searchStr ? JSON.parse(searchStr) : undefined,
          onClickJobCard: handleClick,
        })
      )}
    </div>
  );
}

export default Layout;
// Page1.tsx
function Index(props: any) {
  const {
    searchVal,
    onClickJobCard,
    ...otherProps
  } = props;
  const [filterVals, setFilterVals] = useState<any>({});
    
  useEffect(() => {
    setFilterVals(searchVal);
  }, [searchVal]);
  
  const handleClick = (jobId: string, prefix: string) => {
    onClickJobCard(filterVals, jobId, prefix);
  };
  
  return (
    <div>
      // 这里简单写了,意思到位即可
      <Search value={filterVals} ... />
      <Card onClick={handleClick} ... />
    </div>
}

function Page1(props: any) {
  // 这里的props是原来的props,如果想在原子组件Index中使用,需要作为属性再次传入
  return (
    <JobLayout>
      <Index {...props} />
    </JobLayout>
  );
}

export default Page1;
 

标签:map,const,searchVal,React,props,Children,页面
From: https://www.cnblogs.com/shellon/p/17834667.html

相关文章

  • Map---IdentityHashMap
    概述Thisclassimplementsthe<tt>Map</tt>interfacewithahashtable,usingreference-equalityinplaceofobject-equalitywhencomparingkeys(andvalues).Inotherwords,inan<tt>IdentityHashMap</tt>,twokeys<tt>k1<......
  • 如何在mapbox中将标注添加到面
    consttestGeoJOSN=()=>{//加载GeoJSON数据map.addSource("geojson",{type:"geojson",data:china,generateId:true,});map.addLayer({id:"china",type:"fill",......
  • HashMap
     ......
  • Map集合
        ......
  • 【随手记】mybatis动态sql foreach遍历List<Map>问题
    使用mybatis时经常需要在xml里写动态sql,发现foreach标签使用的问题foreach标签使用当Mapper传参是List<Map<String,Object>集合的形式时,不能直接使用参数名,会找不到对应的参数。list类型的参数会特殊处理封装在map中,map的key就叫list所以collection属性值只能是"list"//m......
  • DevExpress WinForms HeatMap组件,一个高度可自定义热图控件!
    通过DevExpressWinForms可以为WindowsForms桌面平台提供的高度可定制的热图UI组件,体验DevExpress的不同之处。DevExpressWinForms有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。同时能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还......
  • Map遍历删除元素的几种方法
    2哥 :3妹,今天是周末,又不用上班,干嘛看着不开心的样子啊?3妹:你没有看昨天的新闻吗,昨天国家痛失了两位重要人物。2哥:哎,看到了,生老病死,也是没有办法。唯愿逝者安息,生者坚强!我们能做的,就是更加坚强,好好学习,建设祖国!3妹:好吧。2哥:还记得我们之前学习的:list遍历时删除元素的方法 吗,那如......
  • Java集合—HashMap
    HashMap简介HashMap是一个散列表,它存储的内容是键值对(key-value)映射。HashMap实现了Map接口,根据键的HashCode值存储数据,具有很快的访问速度,最多允许一条记录的键为null,不支持线程同步。HashMap是无序的,即不会记录插入的顺序。HashMap继承于AbstractMap,实现了Map、Clone......
  • react使用react-draggable制作可拖拽弹框
    安装yarnaddreact-draggable使用importDraggablefrom'react-draggable';exportdefaultfunctionTableModal(){const[bounds,setBounds]=useState({left:0,top:0,bottom:0,right:0,});constdraggleRef=useRef(null)......
  • Python基础之map()函数
    map()函数会根据提供的对指定的可迭代对象的每个元素进行运算,并将返回运算结果的迭代器。先去将几个例子,这样比较通俗易懂。eg1:输入数据型a=map(int,input().split())输入:1213结果为:分析:map(int,input().split())将输入的值(input.split()的东西也叫做可迭代对象)通过空格......