Я хочу внести изменения в статический массив в одном классе из другого реагировать на родной

Я пытаюсь добавить продукт из моего компонента PRODUCT в статический массив в компоненте CART, но я продолжаю получать сообщение об ошибке фрагмент из компонента CART

export default class Cart extends Component{

    static products=[];
.....

фрагмент из компонента PRODUCT

<Button style = {{flex:1, height:30, alignContent:'center', backgroundColor:'#8ab465'}} 
                        onPress = {()=>{
                            Cart.Products.push({
                                name:this.props.productName,
                                price:this.props.productPrice,
                            })
                        }}

ОШИБКА:

undefined is not an object (evaluating '_cart.Cart.Products')
onPress
   ......

как я могу внести изменения в массив непосредственно из компонента продукта

Вы используете TypeScript?

Canta 01.05.2018 19:29

В вашем компоненте продукта Products - это прописные буквы, но в вашем компоненте Cart - строчные ... При этом я бы не рекомендовал решать это таким образом, поскольку это своего рода противоречие парадигме React.

ken4z 01.05.2018 19:35

да, я изменил имя, но все равно ошибка @ ken4z

Anas Idrissi 01.05.2018 19:47

Я обнаружил, что лучшее решение - использовать AsyncStorage для хранения моего массива и загрузки его в соответствующем месте.

Anas Idrissi 02.05.2018 13:33
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
4
1 296
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Есть быстрые и грязные способы сделать это, но они не принесут вам никакой пользы. Правильный способ - использовать redux, определить объект корзины (не компонент) в магазине redux.

Тогда оба компонента, Корзина и Товары будут использовать этот магазин.

onPress продукта запустит действие, которое добавит этот продукт в корзину. Компонент "Корзина" получит доступ к корзине для отображения ее содержимого.

Это правильный (не единственный) способ решить вашу проблему. Он также пригодится вам в сложных проектах.

Быстрым и грязным способом будет поставить его в окно. См .: Глобальная переменная для реакции

спасибо @Rahamin, но у меня мало времени, и я вообще не использовал redux в своем проекте, если есть другой способ использовать его, просто используя react-native

Anas Idrissi 01.05.2018 20:25

вы можете попробовать что-то вроде этого:

class Cart extends Component {
  products = [];

  handleSubmit = (name, price) => {
    const newItem = {
      name,
      price,
    };
    this.products.push(newItem)
  };

  render() {
    return(
      <div>
        <button onClick = {() => this.handleSubmit('productName', 120)}>Button</button>
      </div>
    )
  }
}

Кроме того, если в большинстве случаев «вам, вероятно, не нужен Redux», ознакомьтесь с этими двумя замечательными статьями:

https://medium.com/@blairanderson/you-probably-dont-need-redux-1b404204a07fhttps://medium.com/@dan_abramov/you-might-not-need-redux-be46360cf367

Спасибо @Vlad Логика моего приложения состоит в том, чтобы добавить кучу продуктов в корзину и отправить массив в качестве заказа, поэтому мне нужно очистить массив и начать в следующем порядке

Anas Idrissi 01.05.2018 21:00
Ответ принят как подходящий

Предполагая, что вы не используете redux, лучший способ сделать это -

в общем предке обоих компонентов создают состояние { products: [] } и обработчик для добавления продукта в это состояние.

export default class Ancestor extends Component {
  constructor() {
    this.state = {
      products: []
    }
  }
  onAddProduct = (product) => {
    // make sure you do not mutate the state else your component
    // will not update
    this.setState({ products: [this.state.products, product] })
  }
  render() {
    return (
      <div>
        <Cart products = {this.props.products}/>
        <Product onAdd = {this.onAddProduct}/>
      </div>
    )
  }
}

теперь в компоненте продукта вы можете использовать

export default class Product extends Component {
  render() {
    return (
      <Button 
        onPress = {() => this.props.onAdd({
          name: this.props.productName,
          price: this.props.productPrice
        })}
      />
    )
  }
}

таким образом ваш компонент корзины будет повторно отображен с правильными продуктами, когда вы добавите новый продукт

При таком подходе вам придется передавать свойства от общего предка к правильным компонентам. Итак, лучший подход - использовать Redux.

Спасибо @Elroy, я попробую ваше решение, в будущем я перейду на redux

Anas Idrissi 01.05.2018 20:52

Другие вопросы по теме