#javascript #android #ios #reactjs #react-native
Вопрос:
У меня здесь настоящий дурдом, и я не могу с этим смириться.
У меня есть этот компонент:
<TouchableOpacity
onPress={() => {
if (myContext.value) {
alert('true');
//changes myContext.value to false
} else {
alert('false');
//changes myContext.value to true
}
}}>
<Text>{myContext.value ? 'working' : 'not working'}</Text>
</TouchableOpacity>
Странная вещь, которую я не понимаю, заключается в том, что контекст изменяет функцию onPress. Поэтому, если я нажму на кнопку, она сначала предупредит об истинном, а затем о ложном и обратно, как и ожидалось. Что не меняется, так это текст, который должен находиться между «работает» и «не работает».
Этот компонент определенно входит в сферу деятельности моего Провайдера. Я использую useContext
, чтобы получить доступ к myContext
.
Кто-нибудь знает, почему это может произойти?
Ответ №1:
Здесь следует отметить, что простое изменение myContext.value = false or true
не вызовет повторной визуализации.
Я не уверен, как вы справляетесь с value
изменениями, но я создал точную копию того, что вы хотите
Ознакомьтесь с этой закуской, чтобы увидеть рабочий пример.
Создайте контекст, как показано ниже
import { createContext } from 'react';
const MyContext = createContext();
export default MyContext;
Пример App.js компонент будет выглядеть так
import * as React from 'react';
import { Text, View, TouchableOpacity } from 'react-native';
import Constants from 'expo-constants';
import MyContext from './MyContext';
import MyComponent from './MyComponent';
export default function App() {
const [value, setValue] = React.useState(true);
return (
<MyContext.Provider value={{ value, setValue }}>
<MyComponent />
</MyContext.Provider>
);
}
И ваш компонент, в котором вы хотите выполнить эту операцию, должен выглядеть так
import * as React from 'react';
import { Text, View, StyleSheet, TouchableOpacity } from 'react-native';
import Constants from 'expo-constants';
import MyContext from './MyContext';
export default function MyComponent() {
const myContext = React.useContext(MyContext);
return (
<TouchableOpacity
onPress={() => {
if (myContext.value) {
alert('true');
myContext.setValue(false);
//changes myContext.value to false
} else {
alert('false');
myContext.setValue(true);
//changes myContext.value to true
}
}}>
<Text>{myContext.value ? 'working' : 'not working'}</Text>
</TouchableOpacity>
);
}
Комментарии:
1. Да, это именно то, что я делаю. Я знаю, что он обновляет значение, потому что, когда я нажимаю на него, предупреждение меняется взад и вперед с true на false, оно просто не обновляет текст между «работает» и «не работает», вы можете видеть это в моем текстовом компоненте. Знаете ли вы какую-либо причину, по которой это может произойти?
2. Просто посмотрите на Закуску, которую я предоставил в ответе. Вы увидите, как меняется текст
3. Конечно, я понимаю это, но в моем проекте это не меняется. Знаете ли вы что-нибудь, что могло бы вызвать такое поведение? Это довольно большая кодовая база
4. ты пользуешься этим
myContext.value = false
или этимmyContext.setValue(false)
?