React-Native + Redux 将 ID 传递给组件

Posted

技术标签:

【中文标题】React-Native + Redux 将 ID 传递给组件【英文标题】:React-Native + Redux passing ID to component 【发布时间】:2019-02-18 04:20:00 【问题描述】:

我是 react-native 的新手,最近在我的应用中实现了 Redux。 该应用程序用于在餐厅点餐:)

这是我的餐厅详细信息屏幕的快照,其中包含代表不同菜单的卡片:

<View style=alignItems: 'center'>
                        menus.map((item) => 
                            return (
                                <Card style=width: '95%'>
                                    <TouchableOpacity onPress =() => this.props.navigation.navigate('Products',  menuId: item.sk_id  ,bestellung)>
                                        <CardItem cardBody style=justifyContent: 'center', alignItems: 'center'>
                                            <Text style=styles.textdes> item.typ </Text>
                                        </CardItem>
                                    </TouchableOpacity>
                                </Card>
                            )
                        )

如您所见,onPress 函数导航到产品屏幕并传递一个 menuId! (产品屏幕显示特定菜单的所有食物)

这是我的 Product.js

class Products extends Component 
constructor(props) 
    super(props);
    this.state = 
        loading: 1
    ;

componentDidMount = () => 

    this.props.fetchProducts();
    this.state.menuId;

addItemsToCart = (product) => 
    this.props.addToCart(product);

render() 
    const  products, navigation  = this.props
     const params = this.props.navigation.state;
      const menuId = params ? params.menuId : null;
    return (
        <View style=styles.container>
            <Header style=styles.header>
                <Left>
                    <Button transparent onPress=() => 
                     this.props.navigation.goBack()>
                        <Icon style= fontSize: 35, color: '#FFFFFF' 
                         active name="arrow-back" />
                    </Button>
                </Left>
                <Body>
                    <Title style= fontSize: 25>menuId</Title>
                </Body>
                <Right style=position: 'absolute', right: 20>
                    <Cart navigation=navigation/>
                </Right>
            </Header>
            <StatusBar barStyle="light-content" backgroundColor="#383838" 
              translucent=false />
            <View style=styles.bodyProducts>
                <View>
                    <Text style=color: 
                     '#000', fontSize: 50>menuId</Text>
                </View>
                <FlatList
                data=products
                renderItem=(item) => 
                   <Product item=item addItemsToCart= 
                   this.addItemsToCart product=item/>
                keyExtractor =(item) => item.id
               />
            </View>

        </View>
    );


const mapStateToProps = (state) => (
products: state.products.items

)

export default connect(mapStateToProps addToCart,fetchProducts)(Products);

Product.js 从我的 product.component.js 中获取产品:

 class Product extends Component 
addToCart = () => 
    this.props.addItemsToCart(this.props.item)




render() 
    const  product, menuId  = this.props;
    return (
        <Card>
        <View style=styles.container>

            <Image source=product.picture style=width:400,height:150/>
            <View style=styles.productDes>
                <CardItem cardBody style=justifyContent: 'center', 
                   alignItems: 'center'>

                <Text style=styles.font>menuId</Text>
                </CardItem>
                <Text style=fontSize: 20>€(product.cost).toFixed(2) 
                 </Text>
                <Text style=fontSize: 16>product.description</Text>
                <TouchableOpacity onPress=this.addToCart style= 
                    styles.addBtn>
                    <Text style=styles.text>Hinzufügen</Text>
                </TouchableOpacity>
            </View>
        </View>
                        </Card>

    );




export default Product;

现在的问题是:如何将 menuId 从 product.js 传递到 product.component.js 没有导航?

我希望我能弄清楚我的问题是什么,并期待您的解决方案和帮助:)

【问题讨论】:

menuId 是否存储在 state 的任何位置? 【参考方案1】:

也许你应该更好地将你的 React 组件(基本上是视图)和你的 reducer/副作用(数据获取......)组件分开。

状态在 Redux 存储中,视图只显示存储中的内容。

如果您不想通过导航参数传递menuId,您可以将其添加到您的商店状态 - 基本上您在减速器的状态中添加一个字段来保存当前选择的menuId

在您的 Restaurant-Details 屏幕中,当调用 onPress 时,您将带有 selectedMenuId 的操作发送到您的 redux 商店。 然后在您的 product 屏幕中,从您的 redux 存储中检索 selectedMenuId

为了理解 Redux 架构,我喜欢这个 gif:

【讨论】:

【参考方案2】:

既然您已经在使用 Redux,为什么不将您当前正在查看的菜单 ID 存储在您的商店中呢?当用户选择一个菜单项时,调度一个动作来设置当前的菜单 ID。然后使用选择器来获取你需要的组件中的菜单ID。

希望我没有误解你的问题。

【讨论】:

以上是关于React-Native + Redux 将 ID 传递给组件的主要内容,如果未能解决你的问题,请参考以下文章

将 Redux 添加到 React-Native 应用程序?

最易懂的 redux (react-native state管理神器)

React-Native Redux reducer switch 语句忽略类型

React-native + Redux(Combine Reducers):创建状态结构

react-native 中的 Redux 错误

在react-native中使用redux