javascript - 如何在从另一条路线点击后立即获得徽章渲染

标签 javascript reactjs components

这是我的第一篇文章,如果我不够具体或犯了愚蠢的错误,请多多包涵

所以我正在用 ReactJS(基本的 Reactjs:没有 redux 或任何数据库)为我的学期项目建立一个商店,如果它很重要,我刚开始学习 JS 和 REACT。

我正在使用 AntDesign UI 并通过 react-router-dom 控制路由,this is my file tree 仅供理解。

我有一个有状态的组件,它返回一个带有徽章的购物车图标,这个组件是从标题中调用的。

假设我在位于文件夹 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(里面包含badge).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')
}

我希望你们能解决并让我明白我做错了什么,或者从一开始就不知道,我研究了所有生命周期组件,但如果不看代码示例,我就很难理解。

非常感谢,祝您在办公室度过愉快的一天

最佳答案

您的徽章计数器已绑定(bind)到 Cart(badge).js 中的组件状态。
这是理解码件生命周期的有趣之处,我知道它可能很难理解,但这里有一篇关于它的文章:https://blog.bitsrc.io/understanding-react-v16-4-new-component-lifecycle-methods-fa7b224efd7d
发生的事情是单击徽章会从您的组件生命周期启动 componentDidUpdate 函数,这就是它通过在本地存储中搜索进行更新的原因。在您的本地存储和组件中的 this.state.count 之间没有直接的数据绑定(bind),这都是在您的组件生命周期内完成的。

现在要纠正这个问题有多种解决方案,您需要以一种或另一种方式更新组件状态,或者使用状态以外的其他机制,例如 Redux Store(是的,这需要再次学习)。

关于javascript - 如何在从另一条路线点击后立即获得徽章渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54093213/

相关文章:

javascript - 如何在 chart.js 中的图例项上显示工具提示

javascript - 页面上的 SEO 友好分页,无需更改 URL

javascript - 当宽度变窄时,VideoJS 控件(CC、音频)是否应该出现在视频元素下方?

javascript - Redux:当从数组中删除特定元素时,它会删除最后一个元素

javascript - 将 props 传递给 React Router 4 中的组件

angular - 组件是两个模块 :AppRoutingModule and AppModule 声明的一部分

javascript - 如何在 React 中传递带有事件处理函数的 Prop ?

components - 如何动态创建Ractive的子组件并以编程方式更改它们

javascript - 如何通过添加子项使 div 溢出时可滚动

Javascript 弹出和关闭