通过AI对话的方式学习React—(中)

React-router

现在前端框架虽然语法和api不一样,但是其实大部分实现原理都是一样的,都是基于原生js开发的,我现在用的主要技术栈是Vue2,Vue3这些,想着去react的官方文档去一步一步的学习有些麻烦,而且英文文档看着也很吃力,于是想着能不能借助AI工具根据vue的知识体系去学习react的语法,这样无非就是根据现有的vue知识体系换一种实现语法,可以达到触类旁通的目的,这样学起来省时多了。
AI工具可以用Chatgpt或者其他Ai工具,市面上的AI工具还是挺多的,包括百度的文心一言、讯飞的火星大模型,下面是我借助抖音的AI工具豆包来学习的。
下面是react路由的学习记录,react框架的学习跳转

[通过Ai对话的方式来学习React]

一、路由组件

问题:react的路由有类似vue路由的RouterLink,RouterView组件吗?

在 React Router 中,有类似 Vue Router 的RouterLinkRouterView功能的实现方式:

一、类似RouterLink的实现

  1. 在 React Router 中,

    xml 复制代码
    <Link>

    组件的作用类似于 Vue Router 的

    RouterLink
    

    • <Link>用于在应用中创建导航链接,当用户点击时,会触发路由切换而无需进行完整的页面刷新。
    • 例如:
javascript 复制代码
import { BrowserRouter as Router, Link } from 'react-router-dom';
​
const App = () => (
  <Router>
    <div>
      <Link to="/home">Home</Link>
      <Link to="/about">About</Link>
    </div>
  </Router>
);
​
export default App;

二、类似RouterView的实现

  1. 在 React Router 中,

    xml 复制代码
    <Route>

    组件配合其渲染属性(如

    component
    

    render
    

    children
    

    )起到类似

    RouterView
    

    的作用。

    • 根据不同的路由路径,<Route>会决定渲染哪个组件。
    • 例如:
javascript 复制代码
import { BrowserRouter as Router, Route } from 'react-router-dom';
​
const Home = () => <div>Home Page</div>;
const About = () => <div>About Page</div>;
​
const App = () => (
  <Router>
    <div>
      <Route path="/home" component={Home} />
      <Route path="/about" component={About} />
    </div>
  </Router>
);
​
export default App;

虽然 React Router 的组件名称和用法与 Vue Router 不完全相同,但通过这些组件可以实现类似的路由导航和页面渲染功能。

二、嵌套路由

问题: react的路由怎么实现类似的vue的嵌套路由实现方式

在 React 中,可以使用react-router-dom库来实现类似 Vue 路由的嵌套路由。以下是从类组件和函数组件两个方面进行分析的实现方式:

一、类组件中的嵌套路由实现

  1. 首先,安装react-router-dom库:npm install react-router-dom

  2. 定义父组件和子组件:

    • 例如:
scala 复制代码
class ParentComponent extends React.Component {
  render() {
    return (
      <div>
        <h2>Parent Component</h2>
        {/* 这里可以放置父组件的其他内容 */}
      </div>
    );
  }
}
​
class ChildComponent extends React.Component {
  render() {
    return (
      <div>
        <h3>Child Component</h3>
        {/* 这里可以放置子组件的其他内容 */}
      </div>
    );
  }
}
  1. 设置路由配置:

    • 在路由配置中,可以使用<Route>组件的render属性来渲染带有嵌套路由的组件。
    • 例如:
javascript 复制代码
import { BrowserRouter as Router, Route } from 'react-router-dom';
​
const App = () => (
  <Router>
    <div>
      <Route path="/parent" render={() => (
        <ParentComponent>
          <Route path="/parent/child" component={ChildComponent} />
        </ParentComponent>
      )} />
    </div>
  </Router>
);
​
export default App;

在这个例子中,当访问/parent路径时,会渲染ParentComponent,而在ParentComponent内部,当访问/parent/child路径时,会渲染ChildComponent

二、函数组件中的嵌套路由实现

  1. 同样,先安装react-router-dom库。

  2. 定义函数组件:

    • 例如:
javascript 复制代码
const ParentComponentFunc = () => {
  return (
    <div>
      <h2>Parent Component (Function Component)</h2>
      {/* 这里可以放置父组件的其他内容 */}
    </div>
  );
};
​
const ChildComponentFunc = () => {
  return (
    <div>
      <h3>Child Component (Function Component)</h3>
      {/* 这里可以放置子组件的其他内容 */}
    </div>
  );
};
  1. 设置路由配置:

    • 可以使用useRoutes Hook 来配置嵌套路由,使代码更加简洁。
    • 例如:
javascript 复制代码
import { BrowserRouter as Router, useRoutes } from 'react-router-dom';
​
const routes = [
  {
    path: '/parent',
    element: <ParentComponentFunc />,
    children: [
      {
        path: 'child',
        element: <ChildComponentFunc />
      }
    ]
  }
];
​
const App = () => {
  const element = useRoutes(routes);
  return <Router>{element}</Router>;
};
​
export default App;

通过这些方式,在 React 中可以实现类似 Vue 路由的嵌套路由功能,使应用的路由结构更加清晰和可维护。

三、动态路由匹配

问题: react的路由中怎么实现类似vue路由的动态路由匹配?

在 React Router 中,可以通过以下方式实现类似 Vue Router 的动态路由匹配:

一、类组件中的实现方式

  1. 定义路由配置:

    • 在类组件中,可以使用react-router-domRoute组件和Switch组件来设置路由。动态路由参数可以在路径中使用冒号(:)来表示。
    • 例如:
scala 复制代码
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
​
class UserProfile extends React.Component {
  render() {
    const { match } = this.props;
    return (
      <div>
        <h2>User Profile {match.params.userId}</h2>
      </div>
    );
  }
}
​
class App extends React.Component {
  render() {
    return (
      <Router>
        <Switch>
          <Route path="/user/:userId" component={UserProfile} />
        </Switch>
      </Router>
    );
  }
}
​
export default App;
  1. 获取动态路由参数:

    • 在组件中,可以通过this.props.match.params来获取动态路由参数。在上面的例子中,UserProfile组件可以通过match.params.userId获取到动态的用户 ID。

二、函数组件中的实现方式

  1. 定义路由配置:

    • 在函数组件中,同样使用react-router-domRoute组件和Switch组件来设置路由。动态路由参数的定义方式与类组件相同。
    • 例如:
javascript 复制代码
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
​
const UserProfile = ({ match }) => {
  return (
    <div>
      <h2>User Profile {match.params.userId}</h2>
    </div>
  );
};
​
const App = () => (
  <Router>
    <Switch>
      <Route path="/user/:userId" component={UserProfile} />
    </Switch>
  </Router>
);
​
export default App;
  1. 获取动态路由参数:

    • 在函数组件中,通过组件的参数获取动态路由参数。在上面的例子中,UserProfile组件通过match.params.userId获取到动态的用户 ID。

通过这些方式,在 React Router 中可以实现类似 Vue Router 的动态路由匹配,根据不同的动态参数渲染不同的页面内容。

四、路由重定向

问题:react路由怎么实现类似vue路由的重定向

在 React Router 中,可以通过以下方式实现类似 Vue Router 的重定向功能:

一、类组件中的实现方式

  1. 使用

    Redirect
    

    组件:

    • 在类组件中,可以在需要重定向的地方使用react-router-domRedirect组件。
    • 例如:
javascript 复制代码
import { BrowserRouter as Router, Route, Redirect } from 'react-router-dom';
​
class App extends React.Component {
  render() {
    return (
      <Router>
        <div>
          <Route exact path="/old-path" render={() => <Redirect to="/new-path" />} />
          <Route path="/new-path" component={() => <div>New Path</div>} />
        </div>
      </Router>
    );
  }
}
​
export default App;
  • 在这个例子中,当访问/old-path时,会自动重定向到/new-path
  1. 使用

    withRouter
    

    高阶组件和

    bash 复制代码
    history

    对象:

    • 如果在类组件中需要更复杂的重定向逻辑,可以使用withRouter高阶组件获取history对象,然后在适当的时候调用history.pushhistory.replace进行重定向。
    • 例如:
javascript 复制代码
import { withRouter, RouteComponentProps } from 'react-router-dom';
​
class MyComponent extends React.Component<RouteComponentProps> {
  componentDidMount() {
    if (someCondition) {
      this.props.history.push('/new-path');
    }
  }
​
  render() {
    return <div>Some content</div>;
  }
}
​
const EnhancedComponent = withRouter(MyComponent);
​
const App = () => (
  <Router>
    <div>
      <Route path="/old-path" component={EnhancedComponent} />
      <Route path="/new-path" component={() => <div>New Path</div>} />
    </div>
  </Router>
);
​
export default App;

二、函数组件中的实现方式

  1. 使用

    Redirect
    

    组件:

    • 在函数组件中,同样可以使用Redirect组件进行重定向。
    • 例如:
javascript 复制代码
import { BrowserRouter as Router, Route, Redirect } from 'react-router-dom';
​
const App = () => (
  <Router>
    <div>
      <Route exact path="/old-path" render={() => <Redirect to="/new-path" />} />
      <Route path="/new-path" component={() => <div>New Path</div>} />
    </div>
  </Router>
);
​
export default App;
  1. 使用

    useHistory
    

    Hook:

    • 可以使用useHistory Hook 获取history对象,然后进行重定向。
    • 例如:
javascript 复制代码
import { BrowserRouter as Router, Route, useHistory } from 'react-router-dom';
​
const MyFunctionalComponent = () => {
  const history = useHistory();
  if (someCondition) {
    history.push('/new-path');
  }
  return <div>Some content</div>;
};
​
const App = () => (
  <Router>
    <div>
      <Route path="/old-path" component={MyFunctionalComponent} />
      <Route path="/new-path" component={() => <div>New Path</div>} />
    </div>
  </Router>
);
​
export default App;

通过这些方式,可以在 React Router 中实现类似 Vue Router 的重定向功能,根据特定条件将用户重定向到不同的路由。

五、路由传参

问题:react路由怎么实现类似vue路由的传参方式

在 React Router 中,可以通过以下方式实现类似 Vue Router 的传参方式:

一、类组件中的实现方式

  1. 通过 URL 参数传递参数:

    • 在 React Router 中,可以在路由路径中定义参数,然后在组件中通过this.props.match.params来获取这些参数。
    • 例如:
scala 复制代码
import { BrowserRouter as Router, Route, Link } from 'react-router-dom';
​
class UserProfile extends React.Component {
  render() {
    const { match } = this.props;
    return (
      <div>
        <h2>User Profile {match.params.userId}</h2>
      </div>
    );
  }
}
​
class App extends React.Component {
  render() {
    return (
      <Router>
        <div>
          <Link to="/user/123">User 123</Link>
          <Route path="/user/:userId" component={UserProfile} />
        </div>
      </Router>
    );
  }
}
​
export default App;
  1. 通过查询参数传递参数:

    • 可以使用location.search获取查询参数,然后进行解析。
    • 例如:
javascript 复制代码
import { BrowserRouter as Router, Route, Link } from 'react-router-dom';
import queryString from 'query-string';
​
class SearchResults extends React.Component {
  componentDidMount() {
    const parsed = queryString.parse(this.props.location.search);
    console.log(parsed.keyword);
  }
​
  render() {
    return <div>Search Results</div>;
  }
}
​
class App extends React.Component {
  render() {
    return (
      <Router>
        <div>
          <Link to="/search?keyword=react">Search for React</Link>
          <Route path="/search" component={SearchResults} />
        </div>
      </Router>
    );
  }
}
​
export default App;

二、函数组件中的实现方式

  1. 通过 URL 参数传递参数:

    • 函数组件可以通过解构props.match.params来获取 URL 参数。
    • 例如:
javascript 复制代码
import { BrowserRouter as Router, Route, Link } from 'react-router-dom';
​
const UserProfile = ({ match }) => {
  return (
    <div>
      <h2>User Profile {match.params.userId}</h2>
    </div>
  );
};
​
const App = () => (
  <Router>
    <div>
      <Link to="/user/456">User 456</Link>
      <Route path="/user/:userId" component={UserProfile} />
    </div>
  </Router>
);
​
export default App;
  1. 通过查询参数传递参数:
  • 在函数组件中,可以使用useLocation Hook 获取当前的location对象,然后解析查询参数。
  • 例如:
javascript 复制代码
import { BrowserRouter as Router, Route, Link, useLocation } from 'react-router-dom';
import queryString from 'query-string';
​
const SearchResults = () => {
  const location = useLocation();
  const parsed = queryString.parse(location.search);
  return (
    <div>
      Search Results for {parsed.keyword}
    </div>
  );
};
​
const App = () => (
  <Router>
    <div>
      <Link to="/search?keyword=redux">Search for Redux</Link>
      <Route path="/search" component={SearchResults} />
    </div>
  </Router>
);
​
export default App;
  1. 状态参数(在编程式导航中传递额外信息)
  1. 传参方式:

    • 使用history.push时可以传递一个状态对象作为第三个参数。例如:
ini 复制代码
import { useHistory } from 'react-router-dom';
​
const SomeComponent = () => {
  const history = useHistory();
  const navigateWithState = () => {
    history.push('/page', { message: 'Hello from previous page' });
  };
​
  return <button onClick={navigateWithState}>Navigate with State</button>;
};
  1. 获取参数:

    • 在目标组件中,可以使用useLocation Hook 来获取当前的路由位置信息,然后通过location.state获取传递的状态。例如:
ini 复制代码
import { useLocation } from 'react-router-dom';
​
const TargetComponent = () => {
  const location = useLocation();
  const message = location.state?.message;
​
  return <div>Message: {message}</div>;
};

通过这些方式,可以在 React Router 中实现类似于 Vue Router 的参数传递功能。

六、编程式导航

问题:react路由怎么实现类似vue路由的编程式导航实现方式

在 React Router 中,可以通过以下方式实现类似 Vue Router 的编程式导航:

一、类组件中的实现方式

  1. 使用

    bash 复制代码
    history

    对象:

    • 在类组件中,可以通过withRouter高阶组件将history对象注入到组件的 props 中,然后使用history对象进行编程式导航。
    • 首先安装react-router-domnpm install react-router-dom
    • 示例代码如下:
scala 复制代码
import { withRouter, RouteComponentProps } from 'react-router-dom';
​
class MyComponent extends React.Component<RouteComponentProps> {
  navigateToPage = () => {
    this.props.history.push('/new-page');
  };
​
  render() {
    return (
      <div>
        <button onClick={this.navigateToPage}>Navigate</button>
      </div>
    );
  }
}
​
const EnhancedComponent = withRouter(MyComponent);
​
export default EnhancedComponent;
  1. 使用

    csharp 复制代码
    ref

    获取

    bash 复制代码
    history

    对象:

    • 可以创建一个ref对象,并将其传递给Router组件,然后在需要编程式导航的地方通过ref获取history对象。
    • 示例代码如下:
scala 复制代码
import React, { Component } from 'react';
import { BrowserRouter as Router, Route } from 'react-router-dom';
​
class MyComponent extends Component {
  componentDidMount() {
    const { historyRef } = this.props;
    historyRef.current.push('/new-page');
  }
​
  render() {
    return <div>Some content</div>;
  }
}
​
class App extends Component {
  historyRef = React.createRef();
​
  render() {
    return (
      <Router ref={this.historyRef}>
        <Route path="/old-page" component={MyComponent} />
      </Router>
    );
  }
}
​
export default App;

二、函数组件中的实现方式

  1. 使用

    useHistory
    

    Hook:

    • react-router-dom提供了useHistory Hook,可以在函数组件中获取history对象进行编程式导航。
    • 示例代码如下:
javascript 复制代码
import { useHistory } from 'react-router-dom';
​
const MyFunctionalComponent = () => {
  const history = useHistory();
​
  const navigateToPage = () => {
    history.push('/new-page');
  };
​
  return (
    <div>
      <button onClick={navigateToPage}>Navigate</button>
    </div>
  );
};
​
export default MyFunctionalComponent;

通过这些方式,可以在 React Router 中实现类似 Vue Router 的编程式导航,方便地进行页面跳转和路由控制。

七、路由导航守卫

问题:在 React Router 中,如何配置路由守卫?

在 React Router 中,可以通过以下几种方式来实现类似路由守卫的功能:

一、使用高阶组件(HOC)

  1. 创建一个高阶组件来检查路由访问权限:

    • 例如:
javascript 复制代码
import React from 'react';
import { Route, Redirect } from 'react-router-dom';
​
const withAuth = (Component) => {
  const AuthComponent = (props) => {
    const isAuthenticated = // 这里检查用户是否已登录的逻辑,例如检查本地存储中的 token
      false;
    if (!isAuthenticated) {
      return <Redirect to="/login" />;
    }
    return <Component {...props} />;
  };
  return AuthComponent;
};
​
const ProtectedPage = () => <div>Protected Page</div>;
​
const App = () => (
  <div>
    <Route exact path="/login" component={() => <div>Login Page</div>} />
    <Route
      path="/protected"
      component={withAuth(ProtectedPage)}
    />
  </div>
);
​
export default App;

二、使用useHistoryuseLocation Hook

  1. 在函数组件中,可以使用

    useHistory
    

    useLocation
    

    Hook 来实现类似的功能:

    • 例如:
javascript 复制代码
import React, { useState, useEffect } from 'react';
import { useHistory, useLocation } from 'react-router-dom';
​
const AuthComponent = () => {
  const history = useHistory();
  const location = useLocation();
  const [isAuthenticated, setIsAuthenticated] = useState(false);
​
  useEffect(() => {
    const checkAuth = () => {
      // 这里检查用户是否已登录的逻辑,例如检查本地存储中的 token
      const isLoggedIn = false;
      setIsAuthenticated(isLoggedIn);
      if (!isLoggedIn && location.pathname!== '/login') {
        history.push('/login');
      }
    };
​
    checkAuth();
  }, [history, location]);
​
  return <div>Your content here</div>;
};
​
const App = () => (
  <div>
    <Route exact path="/login" component={() => <div>Login Page</div>} />
    <Route path="/protected" component={AuthComponent} />
  </div>
);
​
export default App;

通过这些方式,可以在 React Router 中实现一定程度的路由守卫功能,控制用户对特定路由的访问权限。

八、路由懒加载

问题:react怎么实现类似vue路由懒加载?

在 React 中,可以通过以下方式实现类似 Vue 路由的懒加载:

一、使用动态导入(Dynamic Import)

  1. 在 React Router 中,对于路由组件可以使用动态导入的方式来实现懒加载。

    • 例如:
javascript 复制代码
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
​
const Home = () => <div>Home Page</div>;
​
const lazyLoadComponent = (() => import('./LazyComponent'))();
​
const App = () => (
  <Router>
    <Switch>
      <Route exact path="/" component={Home} />
      <Route path="/lazy" component={lazyLoadComponent} />
    </Switch>
  </Router>
);
​
export default App;
  • 在这个例子中,LazyComponent只有在用户访问/lazy路径时才会被加载。

二、结合 Suspense 和 lazy 函数

  1. 使用

    react-router-dom
    

    Suspense
    

    组件来处理懒加载组件的加载状态。

    • 首先安装react-router-dom@6.10.0或更高版本,因为从这个版本开始支持Suspense与路由懒加载的结合使用。
    • 示例代码如下:
javascript 复制代码
import { BrowserRouter as Router, Route, Routes, Suspense } from 'react-router-dom';
​
const Home = () => <div>Home Page</div>;
​
const LazyComponent = React.lazy(() => import('./LazyComponent'));
​
const App = () => (
  <Router>
    <Suspense fallback={<div>Loading...</div>}>
      <Routes>
        <Route exact path="/" element={Home} />
        <Route path="/lazy" element={<LazyComponent />} />
      </Routes>
    </Suspense>
  </Router>
);
​
export default App;
  • 在这个例子中,当用户访问/lazy路径时,LazyComponent会被懒加载。如果加载过程中,Suspense组件会显示fallback中的内容,即 "Loading..."。

通过这些方式,可以在 React 中实现类似于 Vue 路由懒加载的功能,提高应用的性能和初始加载速度。

九、路由内置组件

问题:react路由的内置组件有哪些

在 React Router 中,主要的内置组件如下:

一、BrowserRouterHashRouter

   BrowserRouter

  • 使用 HTML5 的 history API 来管理路由,使 URL 看起来更美观和标准。它在服务器端需要正确的配置以避免出现 404 错误。
  • 例如:
javascript 复制代码
import { BrowserRouter as Router, Route, Link } from 'react-router-dom';
​
const App = () => (
  <Router>
    <div>
      <Link to="/home">Home</Link>
      <Route path="/home" component={() => <div>Home Page</div>} />
    </div>
  </Router>
);
   HashRouter

  • 在 URL 中使用哈希(#)来管理路由,适用于旧版浏览器或者不支持 HTML5 history API 的环境。
  • 例如:
javascript 复制代码
import { HashRouter as Router, Route, Link } from 'react-router-dom';
​
const App = () => (
  <Router>
    <div>
      <Link to="/home">Home</Link>
      <Route path="/home" component={() => <div>Home Page</div>} />
    </div>
  </Router>
);

二、Route

  1. 定义路由与组件的对应关系:

    • 根据不同的路径,渲染相应的组件。可以通过componentrenderchildren属性来指定要渲染的内容。
    • 例如:
xml 复制代码
<Route path="/about" component={() => <div>About Page</div>} />
  • 或者:
xml 复制代码
<Route path="/contact" render={() => <div>Contact Page</div>} />
  • 也可以:
javascript 复制代码
<Route path="/services">
  {(props) => <div>Services Page</div>}
</Route>

三、Link

  1. 用于创建导航链接:

    • 当用户点击Link组件时,会触发路由切换而无需进行完整的页面刷新。
    • 例如:
javascript 复制代码
import { Link } from 'react-router-dom';
​
const App = () => (
  <div>
    <Link to="/products">Products</Link>
  </div>
);

四、NavLink

  1. 特殊的

    Link
    

    组件,用于在导航链接上添加特定的样式或属性,以表示当前激活的路由。

    • 例如:
javascript 复制代码
import { NavLink } from 'react-router-dom';
​
const App = () => (
  <div>
    <NavLink to="/home" activeClassName="active">Home</NavLink>
    <NavLink to="/about" activeClassName="active">About</NavLink>
  </div>
);

五、Switch

  1. 用于确保只渲染与当前 URL 匹配的第一个

    Route
    

    组件。

    • 当有多个路由可能匹配时,Switch可以避免不必要的渲染。
    • 例如:
javascript 复制代码
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
​
const App = () => (
  <Router>
    <Switch>
      <Route path="/home" component={() => <div>Home Page</div>} />
      <Route path="/about" component={() => <div>About Page</div>} />
    </Switch>
  </Router>
);

六、Redirect

  1. 用于重定向到另一个路由。

    • 可以在特定条件下触发重定向,例如用户未登录时重定向到登录页面。
    • 例如:
javascript 复制代码
import { Redirect } from 'react-router-dom';
​
const App = () => (
  <div>
    <Route exact path="/old-path" render={() => <Redirect to="/new-path" />} />
  </div>
);

七、Outlet

  1. 在嵌套路由中使用,用于渲染与当前路径匹配的子路由所对应的组件。

    • 例如:
javascript 复制代码
import { BrowserRouter as Router, Route, Routes, Outlet } from 'react-router-dom';
​
const ParentComponent = () => {
  return (
    <div>
      <h2>Parent Component</h2>
      <Outlet />
    </div>
  );
};
​
const ChildComponent = () => {
  return <div>Child Component</div>;
};
​
const App = () => (
  <Router>
    <Routes>
      <Route path="/parent" element={<ParentComponent />}>
        <Route path="child" element={<ChildComponent />} />
      </Route>
    </Routes>
  </Router>
);
​
export default App;

八、Routes(在 React Router v6 中替代了 Switch

  1. 用于包裹一组路由定义,确保只有与当前 URL 匹配的路由被渲染。

    • 例如:
javascript 复制代码
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
​
const App = () => (
  <Router>
    <Routes>
      <Route path="/home" element={<div>Home Page</div>} />
      <Route path="/about" element={<div>About Page</div>} />
    </Routes>
  </Router>
);

九、useParamsuseLocationuseNavigate

   useParams

  • 在函数组件中获取当前路由的参数。
  • 例如:
ini 复制代码
import { useParams } from 'react-router-dom';
​
const ProductDetails = () => {
  const params = useParams();
  const productId = params.productId;
  return <div>Product Details: {productId}</div>;
};
   useLocation

  • 获取当前的路由位置信息,包括路径、查询参数和状态等。
  • 例如:
javascript 复制代码
import { useLocation } from 'react-router-dom';
​
const CurrentLocation = () => {
  const location = useLocation();
  return <div>Path: {location.pathname}</div>;
};
   useNavigate

  • 用于编程式导航,可以实现页面跳转。
  • 例如:
ini 复制代码
import { useNavigate } from 'react-router-dom';
​
const SomeComponent = () => {
  const navigate = useNavigate();
  const navigateToPage = () => {
    navigate('/new-page');
  };
​
  return <button onClick={navigateToPage}>Navigate</button>;
}

十、滚动行为

问题:react中有类似vue路由监听滚动行为的api吗

在 React 中,可以通过以下方式实现类似 Vue 中对路由变化监听滚动行为的功能:

一、使用react-router-domuseLocationuseEffect Hook

  1. 在函数组件中,可以使用

    useLocation
    

    Hook 获取当前的路由位置信息,然后结合

    useEffect
    

    Hook 来监听路由变化,并在变化时执行相应的滚动行为处理逻辑。

    • 例如:
javascript 复制代码
import { useLocation, useEffect } from 'react-router-dom';
​
const MyComponent = () => {
  const location = useLocation();
​
  useEffect(() => {
    window.scrollTo(0, 0);
  }, [location]);
​
  return <div>Your content here</div>;
};
​
export default MyComponent;
  • 在这个例子中,每当路由变化时,页面会自动滚动到顶部。可以根据实际需求修改滚动行为的逻辑。

二、结合BrowserRouterlisten方法和useEffect Hook

  1. 如果需要更复杂的滚动行为控制,可以使用

    BrowserRouter
    

    arduino 复制代码
    listen

    方法,并结合

    useEffect
    

    Hook 来实现。

    • 例如:
ini 复制代码
import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
​
const MyComponent = () => {
  const location = useLocation();
​
  useEffect(() => {
    const handleLocationChange = (location) => {
      // 根据不同的路由执行不同的滚动行为逻辑
      if (location.pathname === '/page1') {
        window.scrollTo(0, 100);
      } else if (location.pathname === '/page2') {
        window.scrollTo(0, 200);
      }
    };
​
    const unlisten = Router.browserRouter().listen(handleLocationChange);
​
    return () => {
      unlisten();
    };
  }, [location]);
​
  return <div>Your content here</div>;
};
​
const App = () => (
  <Router>
    <Routes>
      <Route path="/page1" element={<MyComponent />} />
      <Route path="/page2" element={<MyComponent />} />
    </Routes>
  </Router>
);
​
export default App;
  • 在这个例子中,根据不同的路由路径执行不同的滚动行为。需要注意的是,这里的BrowserRouter.browserRouter()是获取底层的history对象,这种方式可能在不同版本的react-router-dom中有所变化。

虽然 React 没有完全与 Vue 相同的路由监听滚动行为的 API,但通过这些方式可以在 React 应用中实现类似的功能,以满足对不同路由下滚动行为的控制需求。

十一、路由元信息

问题:react路由怎么实现类似vue路由元信息

在 React Router 中,可以通过以下方式实现类似 Vue Router 中的路由元信息:

一、在路由配置中添加自定义属性作为元信息

  1. 在 React Router 的路由配置中,可以为每个路由添加自定义的属性来模拟元信息。

    • 例如:
javascript 复制代码
import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
​
const Home = () => <div>Home Page</div>;
const About = () => <div>About Page</div>;
​
const routes = [
  {
    path: '/',
    element: <Home />,
    meta: {
      title: 'Home',
      description: 'This is the home page.',
    },
  },
  {
    path: '/about',
    element: <About />,
    meta: {
      title: 'About',
      description: 'This is the about page.',
    },
  },
];
​
const App = () => (
  <Router>
    <Routes>
      {routes.map((route) => (
        <Route key={route.path} path={route.path} element={route.element} />
      ))}
    </Routes>
  </Router>
);
​
export default App;

二、在组件中获取路由元信息

  1. 在组件中,可以通过获取当前的路由信息,然后查找对应的元信息。

    • 例如,可以使用useLocation Hook 获取当前路由位置信息,然后根据路径手动查找对应的元信息。
    • 示例代码如下:
javascript 复制代码
import { useLocation } from 'react-router-dom';
​
const PageTitle = () => {
  const location = useLocation();
  const routeMeta = routes.find((route) => route.path === location.pathname)?.meta;
  if (routeMeta) {
    document.title = routeMeta.title;
  }
  return null;
};
​
const App = () => (
  <div>
    <PageTitle />
    {/* Other components and routes */}
  </div>
);
​
export default App;

通过这些方式,可以在 React Router 中实现类似 Vue Router 的路由元信息功能,为不同的路由添加自定义的信息,并在组件中根据这些信息进行相应的处理。

十二、动态路由添加

问题:react路由怎么实现类似vue路由的动态路由添加addRoute

在 React Router 中,可以通过以下方式实现类似 Vue Router 的动态路由:

一、定义动态路由

  1. 在 React Router 中,动态路由是通过在路由路径中使用冒号(

    :
    

    )来表示参数。

    • 例如:
javascript 复制代码
import { BrowserRouter as Router, Route, Link } from 'react-router-dom';
​
const UserProfile = ({ match }) => {
  const userId = match.params.userId;
  return <div>User Profile: {userId}</div>;
};
​
const App = () => (
  <Router>
    <div>
      <Link to="/user/123">Go to User 123</Link>
      <Route path="/user/:userId" component={UserProfile} />
    </div>
  </Router>
);
​
export default App;

在这个例子中,/user/:userId是一个动态路由,:userId表示一个动态参数。当用户点击链接导航到/user/123时,UserProfile组件会被渲染,并且可以通过match.params.userId获取到动态参数123

二、获取动态参数

  1. 在组件中,可以通过

    csharp 复制代码
    props.match.params

    来获取动态路由参数。

    • 例如,在上面的UserProfile组件中,通过match.params.userId获取到用户 ID。

三、编程式导航到动态路由

  1. 在 React Router 中,可以使用编程式导航来跳转到动态路由。

    • 例如,使用useHistory Hook 进行编程式导航:
javascript 复制代码
import { useHistory } from 'react-router-dom';
​
const SomeComponent = () => {
  const history = useHistory();
  const navigateToUser = (userId) => {
    history.push(`/user/${userId}`);
  };
​
  return (
    <div>
      <button onClick={() => navigateToUser(456)}>Go to User 456</button>
    </div>
  );
};
​
export default SomeComponent;

通过这些方式,可以在 React Router 中实现类似 Vue Router 的动态路由功能,根据不同的动态参数渲染不同的页面内容。

react路由怎么实现类似vue路由的动态路由添加addRoute

在 React Router v6 中,可以通过以下方式模拟类似 Vue Router 的动态添加路由(addRoute)功能:

一、使用路由配置对象和useRoutes Hook

  1. 创建一个路由配置对象数组,然后在需要动态添加路由的时候修改这个数组,并重新渲染路由。

    • 例如:
javascript 复制代码
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import { useMemo } from 'react';
​
let routes = [
  {
    path: '/home',
    element: <div>Home Page</div>,
  },
];
​
const App = () => {
  const newRoutes = useMemo(() => {
    // 根据某些条件动态添加路由
    if (someCondition) {
      return [
       ...routes,
        {
          path: '/about',
          element: <div>About Page</div>,
        },
      ];
    }
    return routes;
  }, [someCondition]);
​
  const element = useRoutes(newRoutes);
​
  return <Router>{element}</Router>;
};
​
export default App;

在这个例子中,根据someCondition条件动态地向路由配置数组中添加新的路由。

二、使用Routes组件和条件渲染

  1. 通过条件渲染在

    Routes
    

    组件内部动态添加路由。

    • 例如:
javascript 复制代码
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
​
const Home = () => <div>Home Page</div>;
const About = () => <div>About Page</div>;
​
const App = () => {
  const showAboutRoute = true; // 根据某些条件决定是否显示关于页面的路由
​
  return (
    <Router>
      <Routes>
        <Route path="/home" element={<Home />} />
        {showAboutRoute && (
          <Route path="/about" element={<About />} />
        )}
      </Routes>
    </Router>
  );
};
​
export default App;

通过这些方式,可以在 React Router 中实现一定程度上的动态添加路由的功能,类似于 Vue Router 的addRoute方法。但需要注意的是,实现方式可能会因具体需求和应用场景的不同而有所变化。

上面的文章总结了怎么用react路由实现vue路由的api,通过对比着学习,这样会非常高效,因为已经系统的学习过vue-router的api实现方式,所谓换汤不换药,重新用react路由的语法实现一次基本上就能了解的差不多了。后续会持续更新react的状态管理redux学习笔记。

附一个学习框架非常好用的网站,可以对比着学习各种主流前端框架

component-party.lainbo.com/#%E5%93%8D%...

相关推荐
有梦想的刺儿14 分钟前
webWorker基本用法
前端·javascript·vue.js
cy玩具35 分钟前
点击评论详情,跳到评论页面,携带对象参数写法:
前端
qq_390161771 小时前
防抖函数--应用场景及示例
前端·javascript
John.liu_Test2 小时前
js下载excel示例demo
前端·javascript·excel
Yaml42 小时前
智能化健身房管理:Spring Boot与Vue的创新解决方案
前端·spring boot·后端·mysql·vue·健身房管理
PleaSure乐事2 小时前
【React.js】AntDesignPro左侧菜单栏栏目名称不显示的解决方案
前端·javascript·react.js·前端框架·webstorm·antdesignpro
哟哟耶耶2 小时前
js-将JavaScript对象或值转换为JSON字符串 JSON.stringify(this.SelectDataListCourse)
前端·javascript·json
getaxiosluo2 小时前
react jsx基本语法,脚手架,父子传参,refs等详解
前端·vue.js·react.js·前端框架·hook·jsx
理想不理想v2 小时前
vue种ref跟reactive的区别?
前端·javascript·vue.js·webpack·前端框架·node.js·ecmascript
知孤云出岫2 小时前
web 渗透学习指南——初学者防入狱篇
前端·网络安全·渗透·web