Я пытаюсь сохранить реагирующий нативный элемент 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;
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)}
Вы должны заключить свой jsxVal в компонент <Text>
, например:
{
jsxVal === '' ? null : <Text>{jsxVal}</Text>
}
Это потому, что изначально вы используете jsxVal = ''
, который читается как текст. Это должно быть заключено в <Text>
компонент. Когда jsxVal получит какое-то значение, в вашем случае:
jsxVal = <Text>Your number {num} is greater than {randNum}</Text>
Тогда его можно отобразить в компоненте <View>
.
const [message, setMessage] = useState('')
const checkNum = (num) => {
if (num < randNum) {
jsxVal = `Your number ${num} is lower than ${randNum}`;
console.warn("if")
......
setMessage(jsxVal)
Текстовые строки должны отображаться внутри компонента. это означает, что «
<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>
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Обратите внимание, что JavaScript — это НЕ Java. Включите все теги, относящиеся к вашему вопросу: например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [стройный] и т. д.