Ahmed Sawy نشر 11 فبراير 2021 أرسل تقرير نشر 11 فبراير 2021 لوصف مشكلتى قمت بكتابة هذا الكود الصغير .. 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 من in line object الى stylesheet .. كما موضح فى الكود التالى 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; وهنا يظهر هذا الخطأ ``` ReferenceError: darkMode is not defined, ``` وانا اعرف سبب هذا الخطأ واتسائل .. إذا كان ممكنًا ، أريد أن أفعل شيئًا مثل تمرير قيمة boolean DarkMode خارج function body . هل هذا ممكن؟ 1 اقتباس
1 Yomna Raouf نشر 11 فبراير 2021 أرسل تقرير نشر 11 فبراير 2021 لتنفيذ هذا الأمر عادةً ما نقوم بالتالي: الطريقة الأولى هي استخدام الوسم style و إعطائه attribute يسمى jsx بحيث نتمكن من كتابة أكواد javaScript داخل أكواد ال css، و يتم وضع هذا الوسم داخل ال component، لاحظ المثال التالي: import React from "react"; const Button = props => ( <button> {props.children} <style jsx>{` button { padding: ${"large" in props ? "60" : "20"}px; background: ${props.background}; color: black; display: inline-block; font-size: 1em; } `}</style> </button> ); export default function App() { return ( <div> <Button large background="orange"> click me </Button> </div> ); } أو يمكنك وضع التنسيقات الخاصة بوضع معين داخل صنف ما و تقوم بكتابة التنسيقات الخاصة به في ملف styleSheet خارجي و بعدها تقوم بالتبديل بين الأصناف حسب الحالة في الملف الخاص بالمكون، لاحظ المثال التالي: import React, { useEffect, useState } from 'react'; import './Nav.css'; function Nav() { const [show, handleShow] = useState(false); useEffect(() => { window.addEventListener( "scroll", ()=> { if (window.scrollY > 100) { handleShow(true); } else handleShow(false); }); return () => { window.removeEventListener("scroll"); } }, []); return ( <div className={` nav ${show && "nav__black"}`}> {/* نقوم بإضافة صنف حسب قيمة الحالة */} <img className="nav__logo" src="https://upload.wikimedia.org/wikipedia/commons/0/08/Netflix_2015_logo.svg" alt = "Netflix logo" /> <img className="nav__avatar" src="https://pbs.twimg.com/profile_images/1240119990411550720/hBEe3tdn_400x400.png" alt = "Netflix logo" /> </div> ) } export default Nav; أمّا عن تمرير قيمة الحالة خارج الدالة الخاصة به لأنك تريد مشاركته مع مكونات أخرى مثلًا فأعتقد أن هذه وظيفة مكتبات إدارة الحالة مثل Redux مثلًا أو React context api و غيرها 1 اقتباس
1 Salah Eddin Beriani2 نشر 11 فبراير 2021 أرسل تقرير نشر 11 فبراير 2021 لا يمكنك اخراج الخطاف خارج الدالة ولكن في حالتك يمكن ان تدخل styles داخل الدالة وهكذا darkMode سيكون معرف import React, { useState } from 'react'; import { StyleSheet, View, Text, Button } from 'react-native'; function HookProblem() { const [darkMode, setDarkMode] = useState(false); const styles = StyleSheet.create({ con: { backgroundColor: darkMode ? 'black' : 'gray', flex: 1, }, text: { color: darkMode ? 'white' : 'black', }, }); 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; او يمكنك اخراج darkMode الى الخارج باعطاءه لدالة تحتوي styles وترجعها import React, { useState } from 'react'; import { StyleSheet, View, Text, Button } from 'react-native'; function passDarkMode(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 = passDarkMode(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; بالتوفيق اقتباس
السؤال
Ahmed Sawy
لوصف مشكلتى قمت بكتابة هذا الكود الصغير ..
وهنا كل شى يعمل بطريقة صحيحة لكن المشكلة تظهر عندما اريد ان احول ال style من in line object الى stylesheet .. كما موضح فى الكود التالى
وهنا يظهر هذا الخطأ
```
ReferenceError: darkMode is not defined,
```
وانا اعرف سبب هذا الخطأ واتسائل .. إذا كان ممكنًا ، أريد أن أفعل شيئًا مثل تمرير قيمة boolean DarkMode خارج function body . هل هذا ممكن؟
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.