当我点击/index.js
中的链接时,它会将我带到/about.js
页面。
但是,当我将参数名称通过URL(例如 / about?name = leangchhean )从/index.js
传递到/about.js
时,我不知道如何将其输入/about.js
页面。
index.js
import Link from 'next/link'
export default () => (
<div>Click <Link href={{ pathname: 'about', query: { name: 'leangchhean' }}}><a>here</a></Link> to read more</div>
)
答案 0 :(得分:17)
使用Next.js 9或更高版本,您可以获得查询参数:
使用router
:
import { useRouter } from 'next/router'
const Index = () => {
const router = useRouter()
const {id} = router.query
return(<div>{id}</div>)
}
使用getInitialProps
:
const Index = ({id}) => {
return(<div>{id}</div>)
}
Index.getInitialProps = async ({ query }) => {
const {id} = query
return {id}
}
答案 1 :(得分:12)
如何使用路由器挂钩?
您可以在应用程序的任何组件中使用useRouter hook
。
https://github.com/zeit/next.js/#userouter
import Link from "next/link";
<Link href={{ pathname: '/search', query: { keyword: 'this way' } }}><a>path</a></Link>
要么
import Router from 'next/router'
Router.push({
pathname: '/search',
query: { keyword: 'this way' },
})
import { useRouter } from 'next/router'
export default () => {
const router = useRouter()
console.log(router.query);
...
}
答案 2 :(得分:8)
// pages/about.js
import Link from 'next/link'
export default ({ url: { query: { name } } }) => (
<p>Welcome to About! { name }</p>
)
答案 3 :(得分:7)
url
属性已不建议使用Next.js版本6:
https://github.com/zeit/next.js/blob/master/errors/url-deprecated.md
要获取查询参数,请使用getInitialProps
:
import Link from 'next/link'
export default About = ({query}) => (
<div>Click <Link href={{ pathname: 'about', query: { name: 'leangchhean' }}}><a>here</a></Link> to read more</div>
)
About.getInitialProps = ({query}) => {
return {query}
}
class About extends React.Component {
static getInitialProps({query}) {
return {query}
}
render() {
console.log(this.props.query) // The query is available in the props object
return <div>Click <Link href={{ pathname: 'about', query: { name: 'leangchhean' }}}><a>here</a></Link> to read more</div>
}
}
查询对象将类似于:url.com?a=1&b=2&c=3
变为:{a:1, b:2, c:3}
答案 4 :(得分:4)
如果您需要从组件外部检索URL查询:
import router from 'next/router'
console.log(router.query)
答案 5 :(得分:2)
对于那些寻求与静态出口兼容的解决方案的人,请尝试此处列出的解决方案:https://github.com/zeit/next.js/issues/4804#issuecomment-460754433
简而言之,router.query
仅适用于SSR应用程序,但router.asPath
仍适用。
因此可以使用exportPathMap(非动态)在next.config.js
中配置查询预导出:
return {
'/': { page: '/' },
'/about': { page: '/about', query: { title: 'about-us' } }
}
}
或者使用router.asPath
并使用query-string之类的库自己解析查询:
import { withRouter } from "next/router";
import queryString from "query-string";
export const withPageRouter = Component => {
return withRouter(({ router, ...props }) => {
router.query = queryString.parse(router.asPath.split(/\?/)[1]);
return <Component {...props} router={router} />;
});
};
答案 6 :(得分:1)
import { useRouter } from 'next/router';
function componentName() {
const router = useRouter();
console.log('router obj', router);
}
我们可以在路由器内部找到查询对象,通过它可以获取所有查询字符串参数。
答案 7 :(得分:0)
Next.js已经提供了带有示例的外观
https://github.com/zeit/next.js/tree/master/examples/with-next-routes
答案 8 :(得分:-2)
Post.getInitialProps = async function(context) {
const data = {}
try{
data.queryParam = queryString.parse(context.req.url.split('?')[1]);
}catch(err){
data.queryParam = queryString.parse(window.location.search);
}
return { data };
};