【问题标题】:Parameter passed with react-navigation's navigate('routeName') is not reactive使用 react-navigation 的 navigate('routeName') 传递的参数不是响应式的
【发布时间】:2019-08-20 09:47:20
【问题描述】:

我正在做一个带有 react-native 的电子商务应用程序。在产品屏幕上,我使用 FlatList 显示存储在 MobX 可观察数组中的所有产品,当您点击产品时,我将该产品(对象)作为参数传递给 react-navigation 的导航到另一个屏幕(ProductDetails),在那里人们可以添加/减少数量,最后可以将该项目添加到购物车。但是,在 ProductsDetails 屏幕中,数量不是反应性的。

商店中的数量确实得到了更新,当我返回并再次进入 ProductDetails 屏幕时,我看到了这一点。

我尝试查看不同的文章,但找不到真正适合我的东西。任何帮助将不胜感激。

//in Products List page

onPress = (item) => { // onPress of a FlatList item
 this.props.navigation.navigate('ProductDetails', {
            product: item
  })
}
//in ProductDetails screen

export default class ProductDetails extends Component {

    product = this.props.navigation.getParam('product')

    addQty = () => {
         this.product.qty = this.product.qty + 1;
    }

... (other code)
}

【问题讨论】:

  • 嗨@hong develop,我试过了,但没有成功。没有必要将“项目”作为对象传递,我改变了这一点。数量确实会在商店中更新,但不是响应式的。
  • 嗨@Gaurav,感谢您的贡献,我理解您的意思,但我想要的是每次调用 addQty 时重新渲染“ProductsDetails”屏幕。 this.navigation.push('WhateverScreen') 在调用屏幕本身时渲染屏幕。反正我也试过了,但还是不行。
  • 嗨@Israt,感谢您的回答。不过,这对我来说似乎是一种解决方法,mobX 不能通过 react-navigation 跟踪 observables 吗?

标签: react-native mobx react-native-navigation


【解决方案1】:

你能试试这个吗?

onPress = (item) => { // onPress of a FlatList item
 this.props.navigation.navigate('ProductDetails', {
            product:  item 
  })
}

【讨论】:

    【解决方案2】:

    this.props.navigation.push('ProductDetails', {product: { item } }) 尝试使用 push 再次重新渲染组件, .navigate 所做的是它检查导航堆栈,如果它在那里,那么它不会再次渲染。但是 push 总是重新渲染组件。所以试试吧。

    【讨论】:

      【解决方案3】:

      这个问题将由 React Native Event Listeners (react-native-event-listeners) 解决。 添加 EventRegister

      //in Products List page
      
      import { EventRegister } from 'react-native-event-listeners'
      
        componentWillMount() {
              this.listener = EventRegister.addEventListener('myCustomEvent', (item) => {
                console.log(item);
      		// update quantity here
              })
          }
          
          componentWillUnmount() {
              EventRegister.removeEventListener(this.listener)
          }
      
      
      //in ProductDetails screen
        
       EventRegister.emit('myCustomEvent', item)
      
       

      【讨论】:

        【解决方案4】:

        就像上面所说的那样:

        this.props.navigation.navigate('ProductDetails', {product: { item } })
        

        但是他们忘了加上params的用法,所以在ProductDetails里面使用params:

        this.props.navigation.state.params.product
        

        【讨论】:

        • 嗨,Idan,它似乎不再起作用了。你是说通过 push 传递的参数会变得反应? AFAIK 推送与导航相同,只是它不查看堆栈而是创建屏幕的新实例。如果我错了,请纠正我。
        • 对不起,不是push,我又改了正确的方式
        • 对不起,Idan,它仍然不起作用。我目前正在做的是将导航参数存储到本地状态并更新 addQty 中的状态,这可行,但也是一种解决方法。感谢您的贡献!
        • 当你尝试我的代码时在做什么?和同一个 stackNavigator 中的屏幕?
        • 虽然 store 对象确实被修改了但仍然没有反应。
        猜你喜欢
        • 1970-01-01
        • 2021-04-05
        • 1970-01-01
        • 1970-01-01
        • 2020-05-29
        • 1970-01-01
        • 2019-04-28
        • 1970-01-01
        • 2017-12-19
        相关资源
        最近更新 更多