【发布时间】:2019-06-03 05:29:54
【问题描述】:
这是我的第一篇文章,如果我不够具体或犯了愚蠢的错误,请保持温和
所以我在 ReactJS 中为我的学期项目建立了一个商店(基本的 Reactjs:没有 redux 或任何数据库),如果这很重要,我刚刚开始学习 JS 和 REACT。
我正在使用 AntDesign UI 并通过 react-router-dom 控制路由,this is my file tree 只是为了理解。
我有一个 statefull 组件,它返回一个带有徽章的购物车图标,这个组件是从 Header 调用的。
假设我在位于文件夹 src->landingpage 中的landingpage 组件内,每次按下特定按钮时,徽章应该增加 1。
现在的问题是我只能在点击后才能看到徽章增量,而不是在标题上的“实时”,我如何通过任何组件使其实时工作?
Cart(badge).js 代码->
import React, { Component } from "react";
import { Icon, Col, Badge, Button, Switch } from 'antd';
import CartCount from '../CartCount'
const ButtonGroup = Button.Group;
class Cart extends Component {
constructor() {
super();
this.state = {
count: 0,
show: true,
}
};
componentDidMount() {
var counter1 = JSON.parse(localStorage.getItem("Carts"))
if (counter1 != this.state.count) {
this.setState({ count: counter1 })
}
}
componentDidUpdate() {
var counter1 = JSON.parse(localStorage.getItem("Carts"))
if (counter1 != this.state.count) {
this.setState({ count: counter1 })
}
}
render() {
return (
<Col offset={23}>
<Badge count={this.state.count}>
<span style={{ fontSize: "50px" }} className="head-example"><Icon type="shopping-cart" /></span>
</Badge>
</Col>
)
}
}
export default Cart;
Header(内含徽章).js代码->
import React, { Component } from 'react';
import { Link } from "react-router-dom";
import { Layout } from 'antd';
import Login from '../login/login'
import {withRouter} from 'react-router'
import Cart from '../CartIndex/Cart/Cart'
import { Row, Col, Button, Tabs, Icon } from 'antd';
import './Header.css'
class Header extends Component {
state=({
count: 0,
reload: false
})
render() {
const { Header } = Layout;
return (
<div>
{/*Login section*/}
<Row>
<Col span={24}>
<Login />
</Col>
</Row>
{/*Header section*/}
<Row>
<Header style={{ fontFamily: 'Anton', fontSize: "50px" }}>
<Col span="23">
<a style={{ color: "white" }} href="/">Store</a>
</Col>
<Link to="/CartIndex"><Cart/></Link>
</Header>
</Row>
</div>
);
}
}
export default withRouter(Header)
我在登录页面中执行的 onClickHandler 函数->
onCartHandler = () => {
if (localStorage.getItem("Carts")) {
var counter1 = JSON.parse(localStorage.getItem("Carts"))
counter1 += 1;
localStorage.setItem("Carts", counter1)
}
else {
var Counter = JSON.stringify(1)
localStorage.setItem("Carts", Counter)
}
message.success('Successfully added to cart')
}
我希望你们能解决并让我明白我做错了什么或者从一开始就不知道,我研究了所有的生命周期组件,但它对于我来说是通用的,没有看代码示例就可以理解。
非常感谢,祝您在办公室度过愉快的一天
【问题讨论】:
-
您必须修改状态以强制重新渲染组件。您只是将计数器存储在
localStorage中。阅读 React JS 状态。 -
是的,我知道我只是很难打开我的脑袋,因为据了解,我从另一个不相关的组件调用增量函数,我用 componentDidUpdate() 捕获了导致 setState 的变化(和应该实时渲染组件(?))所以我“不只是存储本地存储......我”将它推入状态
标签: javascript reactjs components