React-Router Hooks

Route

写法1

<Route path="/child">
  <Child />
</Route>
// 类似
<Route path="/child" children={<Child />}></Route>

children 组件使用一个特殊的 children prop 来将 Route 的子组件传递到渲染结果中。

写法2

<Route path="/child" component={Child}></Route>

component 属性引用一个 React 组件,可以是函数组件或者类组件。

写法3

<Route path="/child" render={() => (<div>Child</div>)}></Route>
// 类似写法2
<Route path="/child" component={() => (<div>Child</div>)}></Route>
// 类似写法1
<Route path="/child" children={<div>Child</div>}></Route>

render 这对于内联渲染很方便。具有 render prop 的组件接受一个函数,该函数返回一个 React 元素。

Hooks

React Router附带了一些挂钩,在组件内部调用这些钩子可以访问路由的状态。(React >= 16.8)

1、useHistory
2、useLocation
3、useParams
4、useRouteMatch


useHistory 该钩子提供对 history 对象的访问。 使用方法与使用props.history相同。

function HomeButton(props) {
  let history = props.history;

  function handleClick() {
    history.push("/home");
  }

  return (
    <button type="button" onClick={handleClick}>
      Go home
    </button>
  );
}

新代码

function HomeButton() {
  let history = useHistory();

  function handleClick() {
    history.push("/home");
  }

  return (
    <button type="button" onClick={handleClick}>
      Go home
    </button>
  );
}

useLocation 该挂钩提供对 location 对象的访问,这对于需要了解当前URL的任何组件很有用。

const LinkToFaqComponent = (props) => {
  return (
    <Link to=`${props.location.pathname}/faq`>
      Read Our FAQ Here!
    </Link>
  )
}

export const LinkToFaq = withRouter(LinkToFaqComponent)

新代码

const LinkToFaqComponent = (props) => {
  return (
    <Link to=`${props.location.pathname}/faq`>
      Read Our FAQ Here!
    </Link>
  )
}

export const LinkToFaq = withRouter(LinkToFaqComponent)

useParams 返回URL参数的键/值对的对象。 使用它来访问当前<Route>match.params

// Component A:
const ComponentA = (props) => {
  const { id } = props.match.params;
  return <ComponentB id={id} />;
}
export const RoutedComponentA = withRouter(ComponentA);

// Component B:
const ComponentB = (props) => (<div>My ID is: {props.id}</div>);

新代码

const ComponentA = () => {
  return <ComponentB />;
}

// Component B:
const ComponentB = () => {
  const { id } = useParams();
  return (<div>My ID is: {id}</div>);
}

useRouteMatch 当您只需要路由匹配数据而无需实际渲染路由时,可以使用此钩子。

function BlogPost() {
  return (
    <Route
      path="/blog/:slug"
      render={({ match }) => {
        // 你只想在匹配的URL但是不渲染任何内容
        return <div />;
      }}
    />
  );
}
import { useRouteMatch } from "react-router-dom";

function BlogPost() {
  let match = useRouteMatch("/blog/:slug");

  // 你只想在匹配的URL但是不渲染任何内容
  return <div />;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端精髓

小礼物走一走,来CSDN关注我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值