前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Umi4获取不到props,默认为空对象

Umi4获取不到props,默认为空对象

作者头像
德顺
发布2022-09-26 18:51:33
1.7K1
发布2022-09-26 18:51:33
举报
文章被收录于专栏:前端资源前端资源

升级到 Umi4 后,有同事和我反映,之前的一些组件不能用了,获取不到 propsprops 是空对象。

Umi4 在代码层做了修改,将 [email protected] 升级到 [email protected],所以路由相关的一些 api 存在着使用上的差异。

props 默认为空对象,以下属性都不能直接从 props 中取出:

需要采用下面的方式:

children
代码语言:javascript
复制
import { Outlet } from 'umi';
<Outlet />;

主要在全局 layout 中需要修改:

如 layouts/index.tsx

代码语言:javascript
复制
import React from 'react';
+ import { Outlet } from 'umi';
 
export default function Layout(props) {
  return (
    <div>
-      { props.children }
+      <Outlet />
    </div>
  );
}

使用了 React.cloneElement 方式渲染的路由组件改造,示例

代码语言:javascript
复制
import React from 'react';
+ import { Outlet } from 'umi';
 
export default function RouteComponent(props) {
  return (
    <div>
-      { React.cloneElement(props.children, { someProp: 'p1' }) }
+      <Outlet context={{ someProp: 'p1' }} />
    </div>
  );
}

组件改成从 useOutletContext 取值

代码语言:javascript
复制
import React from 'react';
+ import { useOutletContext } from 'umi';
 
- export function Comp(props){
+ export function Comp() {
+   const props = useOutletContext();
 
  return props.someProp;
}
history
代码语言:javascript
复制
+ import { history } from 'umi';
export default function Page(props) {
  return (
    <div onClick={()=>{
-          props.history.push('list');
+          history.push('list');
    }}>
    </div>
  );
}
location

建议组件或 hooks 里用 useLocation 取,其他地方就用 window.location 获取。

代码语言:javascript
复制
export default function Page(props) {
+  const { location } = window;
  return (
    <div>
-     { props.location }
+     { location }
    </div>
  );
}

或者

代码语言:javascript
复制
+ import { useLocation } from 'umi';
export default function Page(props) {
+    let location = useLocation();
  return (
    <div>
-     { props.location }
+     { location }
    </div>
  );
}
match
代码语言:javascript
复制
+ import { useMatch } from 'umi';
export default function Page(props) {
+ const match = useMatch({ path: 'list/search/:type' });
  return (
    <div>
-     { props.match }
+     { match }
    </div>
  );
}

需要注意 match 数据的差异:

代码语言:javascript
复制
// match v5
isExact: true
params: {}
path: "/users/abc"
url: "/users/abc"

// match v6
params:{  }
pathname: "/list/search/articles"
pathnameBase: "/list/search/articles"
pattern: {path: 'list/search/:type'}

更多改动和 api 变更,可参考 [email protected]

未经允许不得转载:w3h5 » Umi4获取不到props,默认为空对象

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • children
  • history
  • location
  • match
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档