Реагируйте в собственном стиле, используйте и облегчайте переход

#react-native

Вопрос:

Я изучаю react native и впервые создаю приложение. Я пытаюсь создать приложение, которое приносит случайные цитаты. Мое приложение отображает случайную цитату при загрузке страницы, и когда я нажимаю кнопку обновить, оно случайным образом выдает другую цитату. Всякий раз, когда котировки меняются, я хочу, чтобы каждая цитата color также менялась. Но мой приведенный ниже код не работает. Я получаю сообщение об ошибке как cannot set properties of undefined(setting 'color')

Я считаю, что ошибка в том, что я использовал quoteRef.current.style.color = colors[Math.floor(Math.random() * colors.length)] в своем крючке useEffect

Как я могу это сделать, чтобы это сработало?

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

Мое приложение выглядит так, как я прикрепил прямо сейчас:

приложение-дисплей

Мой код приведен ниже:

 app.js  import { StatusBar } from 'expo-status-bar'; import React from 'react'; import { StyleSheet, Text, View, Button, SafeAreaView, ScrollView } from 'react-native'; import { useState, useEffect, useRef } from 'react';   export default function App() {  const [quotes, setQuotes] = useState([]);  const quoteRef = useRef();  let colors = ["#ffff00", "#90ee90","#ffa500", "#ff68ff", "#a9a9e7"]   const getQuotes = () =gt; fetch('https://quotable.io/quotes?page=1')  .then(response =gt; response.json())  .then(data =gt;  {  let randomQuote = Math.floor(Math.random() * data.results.length);  setQuotes(data.results[randomQuote])  }  );   useEffect(() =gt; {  getQuotes()  }, [])   useEffect(() =gt; {  quoteRef.current.style.color = colors[Math.floor(Math.random() * colors.length)]  }, [quotes])   return (  lt;SafeAreaView style={styles.container}gt;  lt;ScrollViewgt;  {/* {quotes.map(quote =gt; lt;Text key={quote._id}gt;{quote.content}lt;/Textgt;)} */}  lt;Text ref={quoteRef}gt;{quotes.content}lt;/Textgt;  lt;Button  onPress={getQuotes}  title="Refresh"  color="#841584"  accessibilityLabel="Refresh"  /gt;  lt;StatusBar style="auto" /gt;  lt;/ScrollViewgt;  lt;/SafeAreaViewgt;  ); }  const styles = StyleSheet.create({  container: {  flex: 1,  backgroundColor: 'blue',  alignItems: 'center',  justifyContent: 'center',  paddingHorizontal: 10,  paddingTop: Platform.OS === 'android' ? 35 : 0,  }, });   

Комментарии:

1. «Также, как можно придать тексту эффект скольжения вниз при нажатии»-лучше всего задавать только один вопрос на вопрос. Спасибо.

Ответ №1:

Я предполагаю, что это произошло потому quoteRef , что изначально пусто

 const quoteRef = useRef();  

и вы пытались получить к нему доступ в этой строке

 useEffect(() =gt; {  quoteRef.current.style.color = colors[Math.floor(Math.random() * colors.length)]  }, [quotes])  

вместо этого вы можете создать состояние для цвета ИЛИ сделать quotes его объектом {text: string, color: string} , чтобы вы могли удерживать как текст цитаты , так и цвет quotes . Я покажу вам пример для обоих случаев.

  1. добавьте состояние для цвета
 const [quoteColor, setQuoteColor] = useState("");   useEffect(() =gt; {  setQuoteColor(colors[Math.floor(Math.random() * colors.length)])  }, [quotes])  
  1. установить quotes в качестве объекта
 const [quotes, setQuotes] = useState({text: "", color:""});  const getQuotes = () =gt; fetch('https://quotable.io/quotes?page=1')  .then(response =gt; response.json())  .then(data =gt;  {  let randomQuote = Math.floor(Math.random() *   data.results.length);  const randomColor = colors[Math.floor(Math.random() *   colors.length)]  setQuotes({text: data.results[randomQuote], color: randomColor})  }  );   

Комментарии:

1. в этом есть смысл. я попробовал их, но не получилось 🙁 может быть, я что-то упускаю. но большое вам спасибо за ваш ответ. я действительно ценю это

2. вы передали color как а style Text компоненту? Я просто понял, что забыл написать это в ответе

3. о, спасибо, я тоже забыла. должен ли я так писать ? стиль = {цвет: цвет цитаты }

4. это должно быть style={{color: quoteColor}}

5. это сработало , большое вам спасибо 🙂