【问题标题】:react native - how do I pass parameter from one component to another?react native - 如何将参数从一个组件传递到另一个组件?
【发布时间】:2021-03-25 13:05:04
【问题描述】:

我有 2 个屏幕, 一个带有图像选择器和上传功能,另一个带有地图和标记,

我的目标是添加带有照片的标记,并将该照片参考放在我在 firebase 中的标记集合中。

到目前为止,我设法将标记 latlng,

我在地图屏幕内使用模式:在模式内我调用图像选择器,一旦我上传照片并使用:

//inside UploadScreen ~~~
const urlRef =  storage()
            .ref(filename)
            .getDownloadURL();
            console.log('url: ', urlRef)

我需要那个 urlRef 出现在我的其他屏幕模式中。

  <Modal
       isVisible
       transparent
       onBackButtonPress={() => this.setState({ activeModal: null })}
       onBackdropPress={() => this.setState({ activeModal: null })}
      >
        
        <View style={styles.modalView}>
        <UploadScreen />  
        <TouchableOpacity onPress={()=>this.setState({activeModal: null})}>
          <Text> Close</Text>
        </TouchableOpacity>
        <TouchableOpacity onPress={() =>this._addMarker()}> //this adds the marker latlng
          <Text>add marker</Text>
        </TouchableOpacity>
        
        </View>
      </Modal>

在我的地图屏幕上,我调用 &lt;UploadImage/&gt; 来加载该上传图像组件,上传完成后,我得到了需要放入我地图屏幕中的标记集合中的 urlRef。

 _addMarker() {
    console.log('marker cords?: ', this.state.marker)
    console.log('marker cords?: ', this.state.marker.longitude)
    markerRef.add({
      longitude: this.state.marker.longitude,
      latitude: this.state.marker.latitude,
      email: this.state.userEmail,
      imageUri: "will be image uri"
      
    })

  }

请给我一些指导,我不确定那里是否需要道具或其他东西。

欢迎任何建议或帮助。

提前致谢

【问题讨论】:

  • 您需要传递给其他组件的变量到底在哪里?另一个组件在哪里?他们是兄弟姐妹吗?他们有什么关系?
  • 感谢您的回答,urlRef 位于我在地图屏幕的模态中调用的 uploadScreen 组件中,我认为它是一个孩子(因为我在我的地图屏幕的模态中调用它)跨度>
  • 你想把它传递到哪里?到父模态?
  • 是的,如果可能的话,我需要它在那个父模式上。否则我会将所有代码放在一起以获得该参考:(
  • 好的,会留下答案

标签: reactjs react-native


【解决方案1】:

通常,React 中的通信流程是自上而下的。这意味着父母将一些道具传递给孩子,然后孩子反过来用这些道具做一些事情。

但是,显然可以按照您想要的方式进行操作。为此,最简单的方法是在您的模态中使用useState 创建一个状态。然后,您将 setter 传递给子项,当子项中的值被填充时,您将其传回给父项。

在代码中它看起来像这样:

Modal.js (parent)

const [childUrlRef, setChildUrlRef] = useState(null);

<Modal
  isVisible
  transparent
  onBackButtonPress={() => this.setState({ activeModal: null })}
  onBackdropPress={() => this.setState({ activeModal: null })}
 >
        
   <View style={styles.modalView}>
   <UploadScreen setChildUrlRef={setChildUrlRef} />  
   ...
 </Modal>

UploadScreen (child)

当您在孩子中获得您的价值时,将其设置为状态以确保 React 看到它,然后将其传递给您的父母。

const [url, setUrl] = useState(null);

useEffect(() => {
  if (url) props.setChildUrlRef(url);
}, [url])

...

const urlRef =  storage()
.ref(filename)
.getDownloadURL();
console.log('url: ', urlRef)

setUrl(urlRef);
    ...

所以你得到你的变量,将它设置为本地状态,然后让 useEffect 监视该变量的变化,一旦检测到变化,useEffect 就会被触发并通过状态设置器在你的父级中设置值通过道具。

如果您需要在没有直接关系的组件之间传递数据,请考虑使用ReduxReact Context

编辑:我刚刚看到您的 Modal 不起作用。如果你不能重构它,你仍然可以将一个函数传递给孩子,它会在你的父母内部触发setState

【讨论】:

  • 谢谢,我试着学习如何使用 Redux,因为我收到一个错误:“错误:无效的钩子调用。钩子只能在函数组件的主体内部调用”可能是因为关系。非常感谢您的帮助
  • 这肯定是因为您的组件是类。在这种情况下,您必须使用类组件提供的setState 而不是useState。如果您的子组件也是一个类,那么您可以使用componentDidUpdate 而不是useEffect。虽然我建议将所有内容重构为函数:)
猜你喜欢
  • 2019-10-23
  • 1970-01-01
  • 2021-10-15
  • 2018-10-01
  • 2021-04-16
  • 2022-08-17
  • 2021-10-18
  • 2018-05-07
  • 2019-11-06
相关资源
最近更新 更多