Как получить значок рендеринга сразу после нажатия на другой маршрут - PullRequest
0 голосов
/ 08 января 2019

Это мой первый пост, поэтому будьте осторожны, если я недостаточно конкретен или допустил глупую ошибку

Итак, я создаю магазин для своего семестрового проекта в ReactJS (базовый Reactjs: без редуксов или какой-либо базы данных), и, если это важно, я только начал изучать JS и REACT.

Я использую пользовательский интерфейс AntDesign и управляю маршрутами через response-router-dom, это мое файловое дерево только для понимания.

У меня есть компонент statefull, который возвращает значок корзины со значком, и этот компонент вызывается из заголовка.

Допустим, я нахожусь внутри компонента целевой страницы, который находится в папке src-> целевой страницы, и каждое нажатие на определенную кнопку должно увеличивать значок на 1.

Теперь проблема в том, что я могу видеть приращение значка только после нажатия, а не в «реальном времени» в заголовке, как мне заставить его работать в режиме реального времени через любой компонент?

Корзина (значок) .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;

Заголовок (содержит значок внутри) .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')
}

Я надеюсь, что вы, ребята, сможете решить и заставить меня понять, что я сделал неправильно или даже не знал с самого начала, я исследовал все компоненты жизненного цикла, но это было для меня общим, чтобы понять, не видя примеры кода.

Большое спасибо и хорошего дня в офисе

1 Ответ

0 голосов
/ 08 января 2019

Ваш счетчик значков привязан к состоянию вашего компонента в Корзине (значок) .js.
Здесь интересно понять жизненный цикл компонентов, я знаю, что это может быть трудно понять, но вот статья об этом: https://blog.bitsrc.io/understanding-react-v16-4-new-component-lifecycle-methods-fa7b224efd7d
Происходит следующее: щелчок по значку запускает функцию componentDidUpdate из жизненного цикла вашего компонента, поэтому он обновляется при поиске в вашем локальном хранилище. Между вашим локальным хранилищем и this.state.count из вашего компонента нет прямой привязки данных, все это делается с помощью жизненного цикла компонента.

Теперь, чтобы исправить это, есть несколько решений, так или иначе вам нужно обновить состояние вашего компонента или использовать какой-то другой механизм, а не состояние, например, Redux Store (да, это больше, чтобы узнать снова).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...