- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
React Router:链接和路由未将状态传递给组件
我正在使用 React、Redux 和 React Router 构建一个在线购物应用程序。在主页上,显示所有项目。我希望用户能够单击图像并转到包含该项目的项目详细信息的页面。
我正在尝试这样做:
这看起来很简单,我在 SO 和网络上看到了很多关于此的讨论。以下是我已经尝试过的一些:
Display item details after clicking Link in React Router
React router how to click thru to detail components
Passing values through React-Router v4 <Link />
Tyler McGinnis - Pass props to React Router's Link component
Medium - How to pass props to React routes components
我能够将 URL 更改为与项目的 ID 相对应,但我无法让 Item 组件使用正确的信息进行渲染,有时根据我使用的方法,我会收到错误。我在 Item.js 的 div 内硬编码了“Item Component”一词,当我单击主页中的图像时,它将呈现。否则,什么都不会呈现或我收到以下两个类型错误:
App.js:
<Route path="/products" render={(props) => (<Item {...props} id={this.props.location.id} />) }/>
export default withRouter(App);
<App />
包裹在<BrowserRouter>
中在index.js中。
单击主页中的图像时收到以下错误:
类型错误:无法读取未定义的属性“props”
当上面的“渲染”代码被删除并替换为“component={ Item }”时,我从 Item.js 收到此错误:类型错误:无法读取未定义的属性“位置”
<小时/>这是我的其他代码片段:
Item.js:
class Item extends React.Component {
constructor() {
super();
this.state = {
item: this.props.location.state
}
}
render() {
let item = this.state.item;
return (
<div className="item" key={item.id}>
<div className="item-image">
<img src={item.img} alt={item.title} />
</div>
<div className="card-component">
<span className="item-title">{item.title}</span>
<p className="item-price"><b>${item.price}</b></p>
<p className="item-desc">{item.desc}</p>
</div>
</div>
);
}
}
<小时/>
Home.js(显示所有项目),项目详细信息页面链接如下:
<Link to =
{{ pathname: `/products/${item.category}`,
search: `?id=${item.id}`,
state: {id: `${item.id}`} }}
component={ Item }>
<img src={item.img} alt={item.title} />
</Link>
更新
我已经包装了 <Item/>
withRouter()
中的组件。在 Item.js 中,如果我将构造函数中的状态设置为 { item: this.props.location.state }
,没有任何内容按照应有的方式呈现(屏幕上只显示美元符号,因为价格部分包含硬编码的美元符号)。
我尝试将 Item.js 状态设置为 null
在构造函数中,然后调用 this.setState
与 { item: this.props.location.state }
在componentDidMount()
。当我这样做时,我收到以下错误:
类型错误:无法读取 null 的属性“img”
另外,如果我留下render={(props) => (<Item {...props} id={this.props.location.id} />) }
在 <Route>
在App.js
,我收到此错误:
类型错误:无法读取未定义的属性“props”
如果我改变<Route>
返回component={ Item }
,并且 Item.js 构造函数状态设置为 { item: this.props.location.state }
,仅呈现美元符号。
更新:包括 App.js 和 Routes.js 代码
App.js
import React from 'react';
import {
BrowserRouter as Router,
withRouter,
Switch
} from 'react-router-dom';
import './App.css';
import Navbar from './components/Navbar';
import Footer from './components/footer/Footer';
import { Routes } from './constants/Routes';
class App extends React.Component {
render() {
return (
<Router>
<div className="App">
<Navbar />
<Switch>
{ Routes }
</Switch>
<Footer />
</div>
</Router>
);
}
}
export default withRouter(App);
Routes.js
import React from 'react';
import { Route } from 'react-router-dom';
import Home from '../components/Home';
import Item from '../components/shopping/Item';
import Cart from '../components/cart/Cart';
import OrderStatus from '../components/footer/OrderStatus';
import GiftCards from '../components/footer/GiftCards';
import ReturnsExchanges from '../components/footer/Returns-Exchanges';
import Contact from '../components/footer/Contact';
export const Routes = <div>
<Route exact path="/" component={ Home } />
<Route path="/products" component={ Item }/>
<Route path="/cart" component={ Cart } />
<Route path="/order-status" component={ OrderStatus } />
<Route path="/gift-cards" component={ GiftCards } />
<Route path="/returns-exchanges" component={ ReturnsExchanges } />
<Route path="/contact" component={ Contact } />
</div>
最佳答案
一种访问方式 history
任何组件中的对象属性,您需要用 withRouter
包装该组件。进口withRouter
来自react-router-dom
并包裹您的 App
像这样的组件:
export default withRouter(App);
更多关于withRouter .
另外,在 index.js
,确保您的<App />
包裹在里面<BrowserRouter>
.
import { BrowserRouter } from 'react-router-dom';
ReactDOM.render(
<BrowserRouter>
<App />
</BrowserRouter>
, document.getElementById('root'));
编辑:
类型错误:无法读取未定义的属性“props”
替换您的constructor
使用以下代码。为 React 组件实现构造函数时 super(props)
应该在任何其他语句之前,否则 props 将为 undefined
在构造函数中。
constructor(props){
super(props);
this.state = {
item: this.props.location.state
}
}
错误:TypeError:无法读取 null 的属性“img”
原因:状态的初始值不应该是 null
。您可以传递空对象 {}
但在本例中不为空。您正在尝试访问img
, title
, price
和desc
在Item.js
但只是通过id
在state
的<Link>
在Home.js
.
<Link to =
{{ pathname: `/products/${item.category}`,
search: `?id=${item.id}`,
state: {id: `${item.id}`} //pass img, title, desc, price etc as well
}}
component={ Item }>
<img src={item.img} alt={item.title} />
</Link>
关于reactjs - React Router <Link> 和 <Route> 不将状态传递给组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57827964/
我通常从以下位置获取代码:https://www.w3schools.com .这个代码还有一个 Accordion ; 但是,当我使用链接 -> 到 Accordion 时, Accordion 不
我见过的所有 JNI 指南(例如 JNI runtime linking )都建议我将 JNI 库链接到 libjvm.so: $ gcc -I${JAVA_HOME}/include -c -o t
实现以下目标的正确 URL 格式是什么: 使用 Universal Link 在 iOS 上的另一个应用程序中打开 Google map 应用程序。 根据两个坐标设置目的地:纬度和经度,并让用户选择交
我已经查看了 Microsoft 的 MSDN 和整个网络,但我仍然无法很好地了解它是什么。 这是否意味着已完成的程序在执行期间的不同时间加载 DLL,而不是在启动时一次性加载所有 DLL? 我完全偏
我有一个看起来像这样的 css: .browse-link A:link { color: #F6CA4C; text-decoration: none; } .browse-link
当我点击“产品”链接时,它突然指向#link。我怎样才能使它的外观看起来像滚动然后转到产品?请帮帮我。 vStudy function big(x){
我想在保存之前更改从输入字段中获取的值。 params[:link]['url'] = "www.facebook.com/redbull" 现在我只想将“redbull”放入数据库。以下代码失败,因
我正在使用链表编写程序(真是一场噩梦)。 无论如何,该程序的目的是输入 8 个字符,然后让程序将字符打印回给您,并以相反的顺序打印回字符,当然是使用链表。 到目前为止我已经明白了。它有很多错误(我认为
基本上,我删除了 anchor 按钮,因此链接窗口中不应该有指向 anchor 选项的链接。 有什么方法可以删除该下拉选项 ? 最佳答案 想通了 if ( dialogName == 'link' )
我的本地(和远程)SQL SERVER 2005 管理员都声称“允许链接服务器是一个安全问题”并禁止在此处使用它们。 (哈?) 无论如何,有没有办法在没有链接服务器的情况下做类似的事情? SELE
如果我有: linkedlist1= 1,2,3,4; 和 linkedlist2= 5,6,7; 如果我调用: linkedlist2.set(0,9999) 它会更改为 linkedlist2 =
首先,如果这个问题看起来很愚蠢,我很抱歉,但我仍在学习 React 和 html。所以问题是我的 react 代码中有一个按钮标签,它为我提供了一些关于进入我提供的特定链接的逻辑。我的 Button.
我将制作一个文本 block ,这样如果您单击一个单词,它就会被词汇替代品所替换。 例如“fearful-of-cats”是“ailurophobic”的词汇替代品,因为如果您在任何文本中将后者替换为
我有以下代码 Can you click me? 目标是我可以点击“你能点击我吗”框并转到 google 并在包含 div 的任何其他地方
这是一个案例: 默认情况下,如果我点击#2、#3、#4、#5,我将被重定向到#1。 如果我想在没有 #1 激活的情况下点击输入,我该如何修复 CSS? 提前
有没有什么快速的方法可以使 :visited 链接的颜色与链接本身的颜色相同? 例如: * {color:black} a:link {color:blue} a:visited {color:inh
我读到从 iOS 9 开始,引入了通用链接。请解释深层链接和通用链接之间的区别。我的目标是,一个链接将通过邮件发送给客户。让邮件说有一个项目 A 的报价和一个链接。单击链接时 如果安装了该应用程序,则
因此我们需要对 CSS anchor 伪类使用以下顺序 a:link { color: red } a:visited { color: blue } a:hover { color
我组件的当前路径是http://localhost:3000/dashboard/questionnaire/5bf79ff4c45a150015cef7a9在这个组件里面有 Financials 如
我 rsync 目录“Promotion”包含两台具有不同目录结构的机器之间的绝对符号链接(symbolic link)。因此绝对符号链接(symbolic link)在两台机器上都不起作用。为了使它
我是一名优秀的程序员,十分优秀!