Передача данных между двумя компонентами в React Native

У меня есть компонент, который инкапсулирует три компонента, один из них - DrawerLayoutAndroid. Теперь я хочу передать ссылку на выдвижной ящик из компонента выдвижного ящика в основной компонент, а затем передать ее компоненту заголовка, чтобы я мог запускать его из компонента заголовка.

Понятия не имею, как это сделать.

Вот главный компонент case.js

import React, { Component } from 'react';
import { View, Text, StyleSheet, TouchableOpacity } from 'react-native';
import Header from '@components/header';
import BottomBar from '@components/bottom-bar';
import SideBar from '@components/drawer';

export default class Cases extends Component {

  state = {
    title : 'Cases'
  }

  change_text = () => {

    this.setState({ title : 'Test' })

  }

  open_drawer = (ref) => {

    ref.openDrawer();

  }

  close_drawer = (ref) => {

    ref.closeDrawer();

  }

  render() {

    return (

      <SideBar style = { styles.container }>

        <Header title = { this.state.title } change_text = { this.change_text } open = { this.state.side_bar } />

        <View style = { styles.body }>

          <Text style = { styles.text }> { this.state.name } </Text>

          <TouchableOpacity onPress = { () => this.change_text() } style = { styles.button }>

            <Text> Change State </Text>

          </TouchableOpacity>

        </View>

        <BottomBar ref = { this.state.side_bar } />

      </SideBar>

    )

  }

}

const styles = StyleSheet.create({
  container : {
    flex : 1,
    flexDirection: 'column',
  },
  body : {
    flex : 1,
    backgroundColor: '#ccc',
    justifyContent: 'center',
    alignItems: 'center'
  },
  text : {
    color : '#fff'
  },
  button : {
    backgroundColor : '#eee',
    paddingVertical: 5,
    paddingHorizontal: 10
  }
})

Вот мой заголовок:

import React, { Component } from 'react';
import { View, Text, StyleSheet, TouchableOpacity, Image } from 'react-native';
import DrawerLayoutAndroid from 'DrawerLayoutAndroid';
import LinearGradient from 'react-native-linear-gradient';

export default class Header extends Component {

  change_text = () => {

    this.props.change_text();

  }

  open = ()

  render () {

    return (

      <LinearGradient start = {{x: 0, y: 0}} end = {{x: 1, y: 0}} colors = {['#a4d294', '#3ac6f3']} style = { styles.header }>

          <TouchableOpacity onPress = { () => this.props.change_text() }>

            <Image source = { require('@media/images/add.png') } style = { styles.add_button } />

          </TouchableOpacity>

          <Text style = { styles.title }> { this.props.title } </Text>

          <TouchableOpacity onPress = { () => this.props.open() }>

            <Image source = { require('@media/images/more.png') } style = { styles.more_button } />

          </TouchableOpacity>

      </LinearGradient>

    )

  }

}

const styles = StyleSheet.create({
  header : {
    height: 70,
    backgroundColor: '#eee',
    flexDirection: 'row',
    justifyContent: 'space-between',
    alignItems: 'center'
  },
  title : {
    color : '#fff',
    textAlign: 'center',
    fontSize: 20,
    letterSpacing: 3
  },
  add_button : {
    width: 30,
    height: 30,
    marginHorizontal: 10
  },
  more_button : {
    width: 30,
    height: 30,
    marginHorizontal: 10
  }
})

А вот и мой drawer.js

import React, { Component } from 'react';
import { View, Text } from 'react-native';
import DrawerLayoutAndroid from 'DrawerLayoutAndroid';
import LinearGradient from 'react-native-linear-gradient';

export default class Drawer extends Component {

  render () {

    const NavigationMenu = (
      <LinearGradient start = {{x: 0, y: 0}} end = {{x: 0, y: 1}} colors = {['#a4d294', '#3ac6f3']} style = {{ flex: 1 }}>
        <View style = {{ flex : 6, justifyContent: 'center' }}>
          <Text>He There</Text>
        </View>
      </LinearGradient>
    )

    return (

      <DrawerLayoutAndroid
        drawerWidth = {250}
        drawerPosition = { DrawerLayoutAndroid.positions.Right }
        renderNavigationView = { () => NavigationMenu }
        ref = { (drawer) => this.props.ref = drawer }
      >

        { this.props.children }

      </DrawerLayoutAndroid>

    )

  }

}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
3 662
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я отвечу на ваш вопрос, приведя простой пример. Возьмем 2 компонента родительский и дочерний. Вы хотите передать какое-то сообщение от родителя к ребенку и получить обратный вызов от дочернего элемента к родительскому, когда событие происходит в дочернем элементе.

export default class Parent extends React.Component<any, any> {

  callback (paramFromChild) => {
    // implement what to do when certain event occurs in child component
  }

  render () {
    <View>
       <Child message = {"some text"} callbackFromChild = {this.callback}/>
    </View>
  }
}

Дочерний компонент

Interface childProps {
   message: string

   callbackFromChild(paramFromChild);
}

export default class Child extends React.Component<childProps, any> {

  render () {
    <View>
       <Button title = {this.props.message} onPress = {this.props.callbackFromChild("some message from child")}/>
    </View>
  }
}

Таким образом, вы можете общаться между различными компонентами с помощью props.

отлично .. это сработало, но что, если нужно передать параметр от дочернего элемента обратно в функцию родительского компонента? могу я это сделать?

Abdul-Elah JS 18.09.2018 15:30

да, вы можете, вы можете передать параметр через функцию callbackFromchild. Я изменяю свой код в ответе, пожалуйста, обратитесь к нему.

Chandini 19.09.2018 04:24

Вы также должны использовать привязку

Daniel Li 14.02.2019 20:47

Другие вопросы по теме