React Native: как вызвать дочерние ссылки из родительской функции события?

Имеет родительский тег как <TouchableWithoutFeedback> и дочерний как <Image>, пытаясь изменить источник изображения из родительской функции onPress, но получаю ошибку. как я могу заархивировать это с помощью ссылок? или каким-либо другим способом решить эту проблему?

Версия для React-native: 0.56

Ошибка :

Cannot read property 'favIcon' of undefined

Образец кода :

const fav = require('../../images/favorite.png');
const nonfav = require('../../images/not_favorite.png');

updateFavorite = (id) => {
    this.props.refs.favIcon.source(fav);      
}

render(){
  return (
    <View style = {styles.container}>                
       <TouchableWithoutFeedback onPress = { this.updateFavorite.bind(this, 1) }>
         <View style = { styles.imageView }>
           <Image refs = "favIcon" source = { nonfav } />                   
         </View>
       </TouchableWithoutFeedback>
       <TouchableWithoutFeedback onPress = { this.updateFavorite.bind(this, 2) }>
         <View style = { styles.imageView }>
           <Image refs = "favIcon" source = { nonfav } />                   
         </View>
       </TouchableWithoutFeedback>
   </View>
  )
}

Примечание: изменить только дочернее изображение onPressed, а не все изображения.

Несколько вопросов - что такое реф? Я видел только реф. Если ссылки - это вещь, то почему вы используете их как «this.props.refs и т. д.». Вы пробовали ref как функцию?

Ashwin Mothilal 12.10.2018 09:26

@AshwinMothilal, изменил refs на ref во всех местах this.props.ref.favIcon.source(fav); , получая ту же ошибку, что и выше.

151291 12.10.2018 10:41

@AshwinMothilal - как использовать ref как функцию?

151291 12.10.2018 10:42
Поведение ключевого слова "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) для оценки ваших знаний,...
0
3
183
2

Ответы 2

попробуйте использовать nativeProps, например

import resolveAssetSource from 'resolveAssetSource';

this.refs['favIcon'].setNativeProps({
   src: [resolveAssetSource(fav)]
});

обратитесь к это для получения дополнительной информации.

Он может не работать с исходными версиями 0.50+, но, согласно комментарию это, он должен работать с 0.57.1

получение ошибки Cannot read property 'setNativeProps' of undefined.

151291 12.10.2018 08:25

проверять с android или ios?

Ravi 12.10.2018 08:26

проверка в android

151291 12.10.2018 08:29

Я использую 0,56, нужно какое-либо альтернативное решение.

151291 12.10.2018 08:31

Обновление свойств элементов в React лучше всего производить с помощью метода setState. Попробуйте следующее

updateFavorite = (event) => {
  event.target.setAttribute('src', fav)
}

render(){
  return (
    <View style = {styles.container}>       
       <TouchableWithoutFeedback>
         <View style = { styles.imageView }>
           <img ref = {ref => this.favIcon = ref} src = {nonFav} onPress = { this.updateFavorite }/>                   
         </View>
       </TouchableWithoutFeedback>         
       <TouchableWithoutFeedback>
         <View style = { styles.imageView }>
           <img ref = {ref => this.favIcon = ref} src = {nonFav} onPress = { this.updateFavorite } />                   
         </View>
       </TouchableWithoutFeedback>
   </View>
  )
}

получение ошибки - Cannot read property 'favIcon' of undefined

151291 12.10.2018 08:34

Я думаю, это может вызвать какие-то проблемы с функцией? Я правильно звоню?

151291 12.10.2018 08:35

@ 151291 Обновил мой ответ

Firman Wijaya 12.10.2018 08:39

Если у нас есть несколько изображений, все правильно? Мне нужно подать заявку только на одно, означает дочерний элемент <TouchableWithoutFeedback>, у меня их много.

151291 12.10.2018 08:45

@ 151291 Вы можете оставить другой <Image /> без изменений, используя жестко заданный атрибут source. Просто измените атрибут source того, который вы хотите обновить, чтобы взять из this.state.source.

Firman Wijaya 12.10.2018 08:49

Я не получил вышеуказанного!

151291 12.10.2018 08:51

если мы сделаем this.setState({source: this.fav});, он будет применяться ко всем изображениям, верно?

151291 12.10.2018 09:03

@ 151291 Кажется, теперь я понимаю, чего вы хотите. Вы хотите изменить изображение только на определенный> img />. Попробуйте перейти от Press к элементу img (и используйте img вместо Image). Обновил мой ответ

Firman Wijaya 12.10.2018 09:25

<img> будет поддерживать в react-native v0.56 ?, он выдает ошибку!

151291 12.10.2018 14:52

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