Как вставить плоский список в качестве элемента в другой плоский список?

#react-native #react-hooks #react-native-android #react-native-flatlist #react-modal

Вопрос:

Я пытаюсь сделать так , чтобы я мог добавить элемент «Пользователь» в плоский список с помощью модального, и в каждом пользователе я могу добавлять новые элементы с помощью другого модального. Мой целевой результат был бы:

Пользователь 1

  • есть
  • пить
  • …….

Пользователь 2

  • код
  • есть
  • ……

Мой вывод прямо сейчас показывает только пользователя, в то время как элементы для каждого пользователя невидимы, Ваша помощь и поддержка очень ценятся

Это мой код:

   const [isModalVisible_Users, setIsModalVisible_Users] = useState(false);
  const [isModalVisible_Attributes, setIsModalVisible_Attributes] = useState(false);

  const [usersInput, setUsersInput] = useState('');
  const [attributesInput, setAttributesInput] = useState('');

  const [users, setUsers] = useState([]);
  const [attributes, setAttributes] = useState([]);

  useEffect(() => {
    getUsersFromDevice();
  }, []);
  useEffect(() => {
    saveUsersToDevice(users,attributes);
  }, [users,attributes]);

  const ListUsers = ({users}) => {
    return <View style={styles.listItem}>
      <View style={{flex :1}}>
        <Text style={[styles.userText]}>
        {users?.userName}
        </Text>
      </View>
      <TouchableOpacity style={[styles.addAttributes]} onPress={() => changeModalVisibility_Attributes(true)}>
        <Icon name="add" size={15} color={'#fff'}/>
      </TouchableOpacity>
      <Modal
          transparent={true}
          animationType="fade"
          visible={isModalVisible_Attributes}
          onRequestClose={() => changeModalVisibility_Attributes(false)}
        >
              <AddAttributesModal
              changeModalVisibility={changeModalVisibility_Attributes}
              />
      </Modal>
      <FlatList
      showsVerticalScrollIndicator={false}
      contentContainerStyle={{ padding: 20 , paddingBottom: 100}}
      data={attributes}
      renderItem={({ item }) => <ListGrade attributes={item}/>}
      />
    </View>;
  };

  const ListGrade = ({attributes}) => {
    return <View style={styles.listItem}>
      <View style={{flex :1}}>
        <Text style={[styles.attributeText]}>
        {attributes?.attributesName}
        </Text>
      </View>
    </View>;
  };

  const AddUsersModal = () => {
    return <SafeAreaView style={styles.modal}>
    <View style={styles.modalWrapper}>
      <View style={styles.modalTitleWrapper}>
        <Text style={styles.modalTitle}>Add User</Text>
      </View>
      <View style={styles.typeMsgContainer}>
        <TextInput
          editable={true}
          style={styles.typeMsgBox}
          placeholder={'Add User...'}
          value={usersInput}
          onChangeText={(text) => setUsersInput(text)}
        />

        <TouchableOpacity style={styles.sendBtn} onPress={addUsers}>
          <View >
            <Icon name="add" size={30} color="white"/>
          </View>
        </TouchableOpacity>
      </View>
  </View>
  </SafeAreaView>;
  };

  const addUsers = () => {
    if (usersInput === ''){
      Alert.alert('Error', 'Please input todo');
    } else {
      const newUser = {
        id: Math.random(),
        userName: usersInput,
      };
      setUsers([...users,newUser]);
      setUsersInput('');
      changeModalVisibility_Users(false);
    }
  };

  const AddAttributesModal = () => {
    return <SafeAreaView style={styles.modal}>
    <View style={styles.modalWrapper}>
      <View style={styles.modalTitleWrapper}>
        <Text style={styles.modalTitle}>Add Attributes</Text>
      </View>
      <View style={styles.typeMsgContainer}>
        <TextInput
          editable={true}
          style={styles.typeMsgBox}
          placeholder={'Add Attributes...'}
          value={attributesInput}
          onChangeText={(text) => setAttributesInput(text)}
        />

        <TouchableOpacity style={styles.sendBtn} onPress={addAttributes}>
          <View >
            <Icon name="add" size={30} color="white"/>
          </View>
        </TouchableOpacity>
      </View>
  </View>
  </SafeAreaView>;
  };

  const addAttributes = () => {
    if (attributesInput === ''){
      Alert.alert('Error', 'Please input grade');
    } else {
      const newAttribute = {
        id: Math.random(),
        attributesName: attributesInput,
      };
      setGrades([...attributes,newAttribute]);
      setGradeInput('');
      changeModalVisibility_Attributes(false);
    }
  };

  return (
    <SafeAreaView style={{flex:1}}>
      <LinearGradient
                    colors={['#00BFFF', '#87CEFA', '#87CEEB' , '#ADD8E6']}
                    style={{flex:1}}
      >
      <View style={styles.subjectWrapper}>
        <View style={styles.taskTitle}>
          <Text style={styles.sectionTitle}>Subjects</Text>
          <TouchableOpacity onPress={() => changeModalVisibility_Users(true)} style={styles.ClearButton}>
            <Icon name="add" size={25} color="#0066ff"  />
          </TouchableOpacity>
          <Modal
                transparent={true}
                animationType="fade"
                visible={isModalVisible_Users}
                onRequestClose={() => changeModalVisibility_Users(false)}
            >
              <AddUserModal
              changeModalVisibility={changeModalVisibility_Users}
              />
          </Modal>
        </View>
        <FlatList
          showsVerticalScrollIndicator={false}
          contentContainerStyle={{ padding: 20 , paddingBottom: 100}}
          data={users}
          renderItem={({ item }) => <ListSubject user={item}/>}
        />
      </View>
      </LinearGradient>
    </SafeAreaView>
  );
 

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

1. Возможно, оберните внутренний модуль в модуль, а затем импортируйте этот модуль, вызвав его во внешнем плоском списке