Я пытаюсь сохранить реагирующий нативный элемент jsx внутри переменной при печати внутри метода возврата, но получаю ошибку, подобную этой: Текстовые строки должны отображаться внутри компонента. Ниже приведен мой код, в котором я нахожусь получаю ошибку. Любая помощь будет оценена:

import { Text, View, Button } from 'react-native';
import React, { useState } from 'react';

const GameScreen = (props) => {

  const [num, setNum] = useState(0);
  const [randNum, setRandNum] = useState(0);
  const [currentNum, setCurrentNum] = useState('')
  // const [jsxVal, setJsxVal] = useState('')
  let jsxVal = '';

  const setRandomNum = (num, min, max) => {
    const randNum = Math.floor(Math.random() * (max - min)) + min
    setNum(num);
    setRandNum(randNum);
    console.warn("Number is:" + num + " and random number:" + randNum);
  }

  const checkNum = (num) => {
    if (num < randNum) {
      jsxVal = <Text>Your number {num} is lower than {randNum}</Text>;
      console.warn("if")
    } else if (num === randNum) {
      jsxVal = <Text>Your number {num} is greater than {randNum}</Text>;
      console.warn("else if")
    } else {
      jsxVal = <Text>Your number {num} is greater than {randNum}</Text>;
      console.warn("else")
    }
    console.warn("checkNum")
  }

  return (
    <View>
      {
        num === 0 ? setRandomNum(props.navigation.getParam('number'), 1, 100) : null
      }
      <Text>Value is :{num}</Text>
      <View style={{
        justifyContent: 'space-around',
        paddingHorizontal: 8,
        paddingVertical: 8,
        flexDirection: 'row'
      }}>
        <Button title="Lower" onPress={() => { checkNum(num) }} />
        <Button title="Greater" onPress={() => { checkNum(num) }} />
        {
          jsxVal === '' ? null : jsxVal 
        }
      </View>
    </View>
  );
}

export default GameScreen;
1
Hello World 28 Окт 2019 в 11:57

3 ответа

Лучший ответ

Во-первых, вы можете заставить функцию возвращать сам jsx:

 checkNum = (num) => {
   if (num < randNum) {
      return(<Text>Your number {num} is lower than {randNum}</Text>);
   } else if (num === randNum) {
     return(<Text>Your number {num} is greater than {randNum}</Text>);
   } else {
     return(<Text>Your number {num} is greater than {randNum}</Text>);
}}

Затем вы вызываете их метод, где вы хотите:

 <Button title="Greater" onPress={() => { checkNum(num) }} />
 {this.checkNum(num)}
2
whd.nsr 28 Окт 2019 в 10:00

Вы должны заключить свой jsxVal в компонент <Text>, например:

{
 jsxVal === '' ? null : <Text>{jsxVal}</Text> 
}   

Это потому, что изначально вы используете jsxVal = '', который читается как текст. Это должно быть заключено в <Text> компонент. Когда jsxVal получит какое-то значение, в вашем случае:

jsxVal = <Text>Your number {num} is greater than {randNum}</Text> 

Тогда его можно отобразить в компоненте <View>.

1
Sham Gir 28 Окт 2019 в 09:58
 const [message, setMessage] = useState('')
 const checkNum = (num) => {
    if (num < randNum) {
      jsxVal = `Your number ${num} is lower than ${randNum}`;
      console.warn("if")
    ......
     setMessage(jsxVal)

Текстовые строки должны отображаться внутри компонента. это означает, что «» не может быть параметром Button, вместо этого вы должны отправить простое строковое значение и сохранить его в состоянии компонента

<View>
      {
        num === 0 ? setRandomNum(props.navigation.getParam('number'), 1, 100) : null
      }
      <Text>Value is :{num}</Text>
      <View style={{
        justifyContent: 'space-around',
        paddingHorizontal: 8,
        paddingVertical: 8,
        flexDirection: 'row'
      }}>
        <Button title="Lower" onPress={() => { checkNum(num) }} />
        <Button title="Greater" onPress={() => { checkNum(num) }} />
        {
          jsxVal === '' ? null : jsxVal 
        }
        <Text>{message}</Text>
      </View>
    </View>
1
Eran 28 Окт 2019 в 10:02
58588029