在功能组件中反应 URI 参数
React URI params in functional components
从功能性 React 组件读取 URI 参数的正确方法是什么?
在 JavaScript 中,如果组件是 Switch
的直接子组件,我们可以这样做:
function MyComponent(props) {
const query = props.location.search;
// ...
}
如果组件不是 Switch
的直接子组件,我们可以使用 class:
class MyComponent extends Component<RouteComponentProps> {
render() {
const query = this.props.location.search;
// ...
}
}
export default withRouter(MyComponent);
严格的 TypeScript 中的功能组件怎么样?
我们希望 location
属性(以及任何其他,如果有更多的话)由某些 interface
或 type
提供和预定义,但由React,而不是组件的用户。一个丑陋的 hack 是我们自己定义接口,然后期望它实际上是那样的。
如果您将组件(功能性或 class)包装在 withRouter 中,您的 props 会从 react-router 扩展 RouteComponentProps,这可以正确设置,就像您在秒示例中所做的那样。要访问正确的参数,您必须像这样扩展道具:
RouteComponentProps<{ id?: string; }>
这会让 typescript 知道你有一个带有字段 id 的匹配道具,这是可选的。您现在可以使用 props.match.params.id 安全地访问它们。您还可以扩展它,以适应您的其他参数。
希望这可以帮助。编码愉快。
正如在他们的回答中所说,解决方案是简单地扩展道具接口:
import * as React from "react";
import {withRouter, RouteComponentProps} from "react-router";
function MyComponent(props: MyComponentProps) {
const query = props.location.search;
return <span>Query: {query}, myField: {props.myField}</span>;
}
interface MyComponentProps extends RouteComponentProps {
myField: string;
}
export default withRouter(MyComponent);
对于功能组件,使用下面的代码
包括:
import { BrowserRouter as Router, Switch, Route, Redirect, useLocation
} from 'react-router-dom'
在您的功能组件中定义功能:
const useQuery= () => {
return new URLSearchParams(useLocation().search);
}
调用函数:
let query = useQuery();
获取查询获取参数:
console.log("Get data==>",query.get('logout'));
URL: http://localhost:8080/login?logout=false
输出:
Get data==> false
//use useParams
import { useParams } from 'react-router-dom';
const params = useParams()
// yuo can find all params from here
console.log(params)
从功能性 React 组件读取 URI 参数的正确方法是什么?
在 JavaScript 中,如果组件是 Switch
的直接子组件,我们可以这样做:
function MyComponent(props) {
const query = props.location.search;
// ...
}
如果组件不是 Switch
的直接子组件,我们可以使用 class:
class MyComponent extends Component<RouteComponentProps> {
render() {
const query = this.props.location.search;
// ...
}
}
export default withRouter(MyComponent);
严格的 TypeScript 中的功能组件怎么样?
我们希望 location
属性(以及任何其他,如果有更多的话)由某些 interface
或 type
提供和预定义,但由React,而不是组件的用户。一个丑陋的 hack 是我们自己定义接口,然后期望它实际上是那样的。
如果您将组件(功能性或 class)包装在 withRouter 中,您的 props 会从 react-router 扩展 RouteComponentProps,这可以正确设置,就像您在秒示例中所做的那样。要访问正确的参数,您必须像这样扩展道具:
RouteComponentProps<{ id?: string; }>
这会让 typescript 知道你有一个带有字段 id 的匹配道具,这是可选的。您现在可以使用 props.match.params.id 安全地访问它们。您还可以扩展它,以适应您的其他参数。 希望这可以帮助。编码愉快。
正如
import * as React from "react";
import {withRouter, RouteComponentProps} from "react-router";
function MyComponent(props: MyComponentProps) {
const query = props.location.search;
return <span>Query: {query}, myField: {props.myField}</span>;
}
interface MyComponentProps extends RouteComponentProps {
myField: string;
}
export default withRouter(MyComponent);
对于功能组件,使用下面的代码
包括:
import { BrowserRouter as Router, Switch, Route, Redirect, useLocation
} from 'react-router-dom'
在您的功能组件中定义功能:
const useQuery= () => {
return new URLSearchParams(useLocation().search);
}
调用函数:
let query = useQuery();
获取查询获取参数:
console.log("Get data==>",query.get('logout'));
URL: http://localhost:8080/login?logout=false
输出:
Get data==> false
//use useParams
import { useParams } from 'react-router-dom';
const params = useParams()
// yuo can find all params from here
console.log(params)