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 />;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章