gpt4 book ai didi

reactjs - React-Redux |产品列表 |使用 BindActionCreator 添加/删除

转载 作者:行者123 更新时间:2023-12-02 18:38:34 26 4
gpt4 key购买 nike

我正在尝试在 React 中创建一个产品列表,我可以在其中添加和删除产品。

我开始研究如何使用 redux 来做到这一点框架/平台和 native react

我已经有一个函数 productList 容器、​​product 组件和 cartListcartProduct 组件。

我的问题是:

产品:我只能添加产品而不能删除

购物车:反之亦然+购物车不会更新购物车商品的状态。

我已经添加了bindActionCreator,但还不知道如何将其应用到我的productList。

我预计会发生什么?我正在尝试在同一容器/组件中的 react 存储中添加和删除产品。

我该怎么做?我的方法是正确的还是完全错误的?

提前谢谢您。

产品操作创建者

export const ADD_TO_CART = 'ADD_TO_CART'
export const REMOVE_FROM_CART = 'REMOVE_FROM_CART'

export function addItemToCart(row) {
return {
type:'ADD_TO_CART',
payload: row, qty
}
}

export function removeTodo(row) {
return {
type:'REMOVE_FROM_CART' ,
payload: row, qty
}
}

产品列表(简化)

     import React from 'react';
import { Component } from 'react';
import {
View,
StyleSheet,
Text
} from 'react-native';
import Products from '../components/Products';
import { bindActionCreators} from 'redux';
import { connect } from 'react-redux';

import * as ProductActionCreators from '../actions/ProductActionCreators'

export class ProductList extends React.Component {
static navigationOptions = {
header: null,
};
constructor(props) {
super(props);
const { rows } = this.props.navigation.state.params;
const arrays = Object.values( {rows});
this.state = {
arrays,
filteredProducts: arrays,
};
const { dispatch } = props
this.boundActionCreators = bindActionCreators(ProductActionCreators, dispatch)
console.log(this.boundActionCreators)
}



render() {
return (
<View style={styles.container} >
<Text style={styles.title} >
{this.state.arrays[0].name}
</Text>
<Products products={this.state.arrays[0].data} onPress=
//Trying to change this to multiple actions
{this.props.addItemToCart}/>
</View>
)
}
}

const qty = 0;

const mapDispatchToProps = (dispatch) =>{
//need to add BindActionCreator
return{
addItemToCart:(row) => dispatch({
type:'ADD_TO_CART', payload: row, qty

}),
removeItem:(product) => dispatch ({
type:'REMOVE_FROM_CART' , payload: product, qty
})
}

}

export default connect(null, mapDispatchToProps) (ProductList);

产品(简化)

import React, { Component } from "react";
import {
View,
Text,
TouchableOpacity,
TextInput,
FlatList,
} from "react-native";
import Icon from "react-native-vector-icons/Ionicons";

class Products extends Component {
constructor(props) {
super(props);
const { products } = this.props;
this.state = {
products,
filteredProducts: products,
};
}
renderProducts = (products) => {
return (
<View key={products.index}>
<View>
<Icon name={products.item.icon} color="#DD016B" size={25} />
</View>
<View>
<Text style={styles.name}>
{products.item.name}
</Text>
<Text>
€ {products.item.price}
</Text>
</View>
<View style={styles.buttonContainer}>
<TouchableOpacity onPress={() => this.props.onPress(products.item)} >
<Icon name="ios-add" color="white" size={25} />
</TouchableOpacity>

<TouchableOpacity onPress={() => this.props.onPress(products.item)} >
<Icon name="ios-remove" color="white" size={25} />
</TouchableOpacity>

</View>
</View>
)
}

render() {
return (
<View>
<FlatList
style={styles.listContainer}
data={this.state.filteredProducts}
renderItem={this.renderProducts}
keyExtractor={(item, index) => index.toString()}
/>
</View>
);
}
}

export default Products;

reducer /cartItems

const cartItems = (state = [], action) => {
switch (action.type)
{
case 'ADD_TO_CART':
if (state.some(cartItem => cartItem.id === action.payload.id)) {
// increase qty if item already exists in cart
return state.map(cartItem => (
cartItem.id === action.payload.id ? { ...cartItem, qty: cartItem.qty + 1 } : cartItem

));
}
return [...state, { ...action.payload, qty: 1 }];
// else add the new item to cart
case 'REMOVE_FROM_CART':
return state
.map(cartItem => (cartItem.id === action.payload.id ? { ...cartItem, qty: cartItem.qty - 1 } : cartItem))
.filter(cartItem => cartItem.qty > 0);
}
return state
}
export default cartItems

商店/索引

import {createStore} from 'redux';
import cartItems from '../reducers/carItems';

export default store = createStore(cartItems)

应用结构(简化)

Main folder

Containers(folder)

ProductsList.js
CartList.js

Components(folder)

Product.js
cartProduct.js

Reducers(folder)

carItems.js

Actions(folder)

ProductActionCreators.js

Navigation(folder)

AppNavigator,js
MainTabNavigator.js

Assets(folder for images etc.)
Store(folder)

index.js
App.JS
Data.JS (using static JSON file for this development phase)

最佳答案

您有两个不同的操作,addItemToCartremoveItem,您在mapDispatchToProps中定义。现在,您指定了要连接的 mapDispatchToProps 参数,dispatch 方法不可用作连接组件的 prop,而仅由 mapDispatchToProps 返回的方法可用

第二,您不需要使用bindActionCreators,而且绝对不需要在组件中使用。 MapDispatchToProps 可以简单地是一个对象,并且 connect 将在内部使用调度。

第三,您需要将添加和删除操作都传递给子组件。

第四您可以将多个操作简单地作为 prop 传递给 Product 组件

你的代码看起来像

ProductActionCreators.js

export const ADD_TO_CART = 'ADD_TO_CART'
export const REMOVE_FROM_CART = 'REMOVE_FROM_CART'

export function addItemToCart(row) {
return {
type:'ADD_TO_CART',
payload: row
}
}

export function removeItem(item) {
return {
type:'REMOVE_FROM_CART' ,
payload: item
}
}

产品列表

  import React from 'react';
import { Component } from 'react';
import {
View,
StyleSheet,
Text
} from 'react-native';
import Products from '../components/Products';
import { connect } from 'react-redux';

import { addItemToCart, removeItem } from '../actions/ProductActionCreators';

export class ProductList extends React.Component {
static navigationOptions = {
header: null,
};
constructor(props) {
super(props);
const { rows } = this.props.navigation.state.params;
const arrays = Object.values( {rows});
this.state = {
arrays,
filteredProducts: arrays,
};
}



render() {
return (
<View style={styles.container} >
<Text style={styles.title} >
{this.state.arrays[0].name}
</Text>
<Products products={this.state.arrays[0].data} addItemToCart={this.props.addItemToCart} removeItem={this.props.removeItem}/>
</View>
)
}
}


const mapDispatchToProps = {
addItemToCart,
removeItem
}

export default connect(null, mapDispatchToProps) (ProductList);

产品

import React, { Component } from "react";
import {
View,
Text,
TouchableOpacity,
TextInput,
FlatList,
} from "react-native";
import Icon from "react-native-vector-icons/Ionicons";

class Products extends Component {
constructor(props) {
super(props);
const { products } = this.props;
this.state = {
products,
filteredProducts: products,
};
}
renderProducts = (products) => {
return (
<View key={products.index}>
<View>
<Icon name={products.item.icon} color="#DD016B" size={25} />
</View>
<View>
<Text style={styles.name}>
{products.item.name}
</Text>
<Text>
€ {products.item.price}
</Text>
</View>
<View style={styles.buttonContainer}>
<TouchableOpacity onPress={() => this.props.addItemToCart(products.item)} >
<Icon name="ios-add" color="white" size={25} />
</TouchableOpacity>

<TouchableOpacity onPress={() => this.props.removeItem(products.item)} >
<Icon name="ios-remove" color="white" size={25} />
</TouchableOpacity>

</View>
</View>
)
}

render() {
return (
<View>
<FlatList
style={styles.listContainer}
data={this.state.filteredProducts}
renderItem={this.renderProducts}
keyExtractor={(item, index) => index.toString()}
/>
</View>
);
}
}

export default Products;

关于reactjs - React-Redux |产品列表 |使用 BindActionCreator 添加/删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54610920/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com