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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.duanlonglong.com/qdjy/650.html