Задать вопрос
@Shiki00

Redux не добавляет свойство в state. Что делать?

Я хочу добавлять свойство basket: "true" к каждому продукту, на название которого я кликнул.
Action.js:
export const addToBasket = (name) => {
     return {
       type: "BASKET",
       payload: name,
     };
    }

Reducer:
import Alert from 'react-native'
export default function (state=null, action) {
  switch (action.type) {
    case "BASKET":
       var productToUpdate = state.products.find(item => item.name === action.payload);
       productToUpdate = { ...productToUpdate, basket: true }
       var products = state.products.filter(item => item.name !== productToUpdate.name);
       Alert.alert(productToUpdate)
       return { ...state, ...state.products, productToUpdate }
  
      break;
    default:
      return state;
  };
}

ProductDetails. Здесь я использую редюсер в
<Text onPress={() => this.props.addToBasket.bind(this, this.props.product.name)} style={styles.name}>{this.props.product.name}</Text>:

Вот полный код ProductDetails'a(за исключением стилей и импортов):
ProductDetails extends Component {
    render() {
       const { navigation } = this.props;
      if (!this.props.product) {
        return (
          <View>
            <Text>Choose a product</Text>
          </View>
        );
      }
       return (
    
         <View style={styles.productDetailsContainer}>
           <Image
              style={styles.productImg}
              source={{
                uri: this.props.product.img,
              }}
            />
            <View styles={styles.row}>
              <View>
                <Text onPress={() => this.props.addToBasket.bind(this, this.props.product.name)} style={styles.name}>{this.props.product.name}</Text>
                <Text style={styles.price}>{this.props.product.price}</Text>
              </View>
              <Text style={styles.flexEnd} onPress={() => navigation.navigate('Basket')}>Привет!</Text>
            </View>
          </View>
       );
     }
    }
    function mapStateToProps (state) {
      return {
        product: state.active
      };
    }
    function matchDispatchToProps (dispatch) {
      return bindActionCreators({addToBasket: addToBasket}, dispatch)
    }
    export default connect (mapStateToProps, matchDispatchToProps)(ProductDetails);

Basket. Здесь я вывожу продукты с basket: "true" при помощи функции showProductsList()
class Basket extends Component {
    render() {
       const showProductsList = (type, maxlength) => {
         var currentLength = 0;
         return this.props.products.map ((product) => {
           if(product.basket == type & currentLength < maxlength) {
             currentLength += 1;
             return (
                    <View key={product.id}>
                 <Image
                   source={{
                     uri: product.img,
                   }}
                 />
                   <View>
                     <Text>{product.name}</Text>
                     <Text>Price: {product.price}</Text>
                   </View>
                 </View>
             );
           }
         })
    
       }
       if (!this.props.products) {
         return (
           <View>
             <Text>Выберите товар</Text>
           </View>
         );
       } else {
       return (
         <View>
          {showProductsList("true", 4)}
         </View>
       )
    }
    }
    }
    
    function mapStateToProps(state) {
      return {
        products: state.products
      };
    }
    
    export default connect(mapStateToProps)(Basket);
  • Вопрос задан
  • 97 просмотров
Подписаться 1 Простой 2 комментария
Решения вопроса 1
0xD34F
@0xD34F Куратор тега React
case 'BASKET':
  return {
    ...state,
    products: state.products.map(n => n.name === action.payload
      ? { ...n, basket: true }
      : n
    ),
  };

UPD. Ну это уже ни в какие ворота:

onPress={() => this.props.addToBasket.bind(this, this.props.product.name)}

Во-первых, функцию создаёте, но не вызываете. Во-вторых, не нужна тут привязка контекста:

onPress={() => this.props.addToBasket(this.props.product.name)}


const showProductsList = (type, maxlength) => {
    <...>
    if(product.basket == type & currentLength < maxlength) {

showProductsList("true", 4)

Нет, true не будет равно "true", убираем кавычки: showProductsList(true, 4).

Может, прежде чем браться за react, стоит язык освоить, хотя бы основы?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Нижний Новгород
от 80 000 до 120 000 ₽
ITK academy Воронеж
от 50 000 до 90 000 ₽