Есть ли способ передать значение крючка useState из тела функции?

#javascript #reactjs #react-native #react-hooks #use-state

#javascript #reactjs #реагирующий-родной #реагирующие перехваты #use-state

Вопрос:

Это код, который я написал, чтобы описать свою проблему,

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

function HookProblem() {
  const [darkMode, setDarkMode] = useState(false);

  return (
    <View style={{ backgroundColor: darkMode ? "black" : "gray", flex: 1 }}>
      <Text style={{ color: darkMode ? "white" : "black" }}>
        {darkMode ? "That's Dark Mode" : "That's Light Mode"}
      </Text>
      <Button title="Dark Mode" onPress={() => setDarkMode(true)} />
      <Button title="Light Mode" onPress={() => setDarkMode(false)} />
    </View>
  );
}

const styles = StyleSheet.create({
  con: {
    backgroundColor: "yellow",
    flex: 1,
  },
});
export default HookProblem;
 

До сих пор проблем не было, и все работает очень хорошо, но проблема возникает, когда я хочу создать таблицу стилей вместо встроенного объекта style,

Здесь

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



function HookProblem() {
  const [darkMode, setDarkMode] = useState(false);

  return (
    <View style={styles.con}>
      <Text style={styles.text}>
        {darkMode ? "That's Dark Mode" : "That's Light Mode"}
      </Text>
      <Button title="Dark Mode" onPress={() => setDarkMode(true)} />
      <Button title="Light Mode" onPress={() => setDarkMode(false)} />
    </View>
  );
}

const styles = StyleSheet.create({
  con: {
    backgroundColor: darkMode ? "black" : "gray",
    flex: 1,
  },
  text: {
    color: darkMode ? "white" : "black",
  },
});
export default HookProblem;

 

Ошибка ссылки: darkMode не определен, я хочу решить эту проблему, если это возможно, я хочу сделать что-то вроде передачи логического значения darkMode вне тела функции. Возможно ли это?

Ответ №1:

Вы должны иметь возможность вызывать стили const в рендеринге и создавать пользовательскую функцию привязки, например:

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

function useStyles(darkMode) {
  return StyleSheet.create({
    con: {
      backgroundColor: darkMode ? "black" : "gray",
      flex: 1,
    },
    text: {
      color: darkMode ? "white" : "black",
    },
  });
}

function HookProblem() {
  const [darkMode, setDarkMode] = useState(false);
  const styles = useStyles(darkMode);

  return (
    <View style={styles.con}>
      <Text style={styles.text}>
        {darkMode ? "That's Dark Mode" : "That's Light Mode"}
      </Text>
      <Button title="Dark Mode" onPress={() => setDarkMode(true)} />
      <Button title="Light Mode" onPress={() => setDarkMode(false)} />
    </View>
  );
}

export default HookProblem;
 

Ответ №2:

Короткий ответ: невозможно определить переменную внутри функции и получить к ней доступ за пределами этой области.

Вам следует изучить, как создавать темы для приложения react. Я признаю, что лично я этого не делал, но, насколько я понимаю, тема обычно определяется как контекст для всего приложения.

Я не говорю, что это лучший способ сделать это, это просто то, что я видел в Интернете.

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

1. Я знаю, что есть лучшие способы сделать темную тему, например, использовать форму react-navigation. но я стараюсь очень хорошо справляться с состоянием, спасибо ^_ ^