Kodax

State و useState — أساسيات React Native

State في React Native

ما هو State؟

State هو البيانات التي يمكن أن تتغير في تطبيقك. عندما يتغير الـ State، يُعاد رسم المكون تلقائياً.

useState Hook

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

export default function Counter() {
  // [القيمة, دالة التغيير] = useState(القيمة الابتدائية)
  const [count, setCount] = useState(0);

  return (
    <View style={{ alignItems: 'center', padding: 20 }}>
      <Text style={{ fontSize: 48 }}>{count}</Text>
      
      <TouchableOpacity 
        onPress={() => setCount(count + 1)}
        style={{ backgroundColor: '#3b82f6', padding: 15, borderRadius: 10 }}
      >
        <Text style={{ color: '#fff' }}>زيادة</Text>
      </TouchableOpacity>
    </View>
  );
}

أنواع State مختلفة

1. State للنصوص

const [name, setName] = useState('');

<TextInput
  value={name}
  onChangeText={setName}
  placeholder="اسمك"
/>

2. State للقيم المنطقية

const [isVisible, setIsVisible] = useState(false);

<TouchableOpacity onPress={() => setIsVisible(!isVisible)}>
  <Text>{isVisible ? 'إخفاء' : 'إظهار'}</Text>
</TouchableOpacity>

{isVisible && <Text>محتوى مخفي</Text>}

3. State للمصفوفات

const [items, setItems] = useState([]);

const addItem = () => {
  setItems([...items, { id: Date.now(), text: 'عنصر جديد' }]);
};

const removeItem = (id) => {
  setItems(items.filter(item => item.id !== id));
};

4. State للكائنات

const [user, setUser] = useState({
  name: '',
  email: '',
  age: 0,
});

// تحديث خاصية واحدة
setUser({ ...user, name: 'أحمد' });

// تحديث عدة خصائص
setUser(prev => ({
  ...prev,
  name: 'أحمد',
  email: 'ahmed@email.com',
}));

مثال تطبيقي: قائمة مهام

import React, { useState } from 'react';
import { View, Text, TextInput, TouchableOpacity, FlatList } from 'react-native';

export default function TodoList() {
  const [task, setTask] = useState('');
  const [tasks, setTasks] = useState([]);

  const addTask = () => {
    if (task.trim()) {
      setTasks([
        ...tasks,
        { id: Date.now().toString(), text: task, done: false }
      ]);
      setTask('');
    }
  };

  const toggleTask = (id) => {
    setTasks(tasks.map(t => 
      t.id === id ? { ...t, done: !t.done } : t
    ));
  };

  const deleteTask = (id) => {
    setTasks(tasks.filter(t => t.id !== id));
  };

  return (
    <View style={{ flex: 1, padding: 20 }}>
      <View style={{ flexDirection: 'row', marginBottom: 20 }}>
        <TextInput
          value={task}
          onChangeText={setTask}
          placeholder="مهمة جديدة..."
          style={{ flex: 1, borderWidth: 1, padding: 10, borderRadius: 8 }}
        />
        <TouchableOpacity 
          onPress={addTask}
          style={{ backgroundColor: '#3b82f6', padding: 10, borderRadius: 8, marginLeft: 10 }}
        >
          <Text style={{ color: '#fff' }}>إضافة</Text>
        </TouchableOpacity>
      </View>

      <FlatList
        data={tasks}
        keyExtractor={item => item.id}
        renderItem={({ item }) => (
          <View style={{ flexDirection: 'row', padding: 15, backgroundColor: '#f5f5f5', marginBottom: 10, borderRadius: 8 }}>
            <TouchableOpacity onPress={() => toggleTask(item.id)}>
              <Text style={{ fontSize: 20 }}>{item.done ? '✅' : '⬜'}</Text>
            </TouchableOpacity>
            <Text style={{ flex: 1, marginLeft: 10, textDecorationLine: item.done ? 'line-through' : 'none' }}>
              {item.text}
            </Text>
            <TouchableOpacity onPress={() => deleteTask(item.id)}>
              <Text style={{ color: 'red' }}>حذف</Text>
            </TouchableOpacity>
          </View>
        )}
      />
    </View>
  );
}
اختبر فهمك