Как я могу изменить данные плоского списка с помощью функции?

#react-native #function #react-native-flatlist

#react-native #функция #react-native-плоский список

Вопрос:

У меня есть массив, содержащий словари, которые представлены в flatlist. Всякий раз, когда я касаюсь компонента, я хочу выполнить функцию, которая изменяет данные определенных словарей. например:

 const data = [
    { duration: null, uri: null, step: 0, index: 0 }
    { duration: null, uri: null, step: 0, index: 1 }
    { duration: null, uri: null, step: 0, index: 2 }
    { duration: null, uri: null, step: 0, index: 3 }
]

const updataData = (duration, uri) => {
    duration = 1000;
    uri = 'jsdbbsljv_sjk_jka'
}

return (
    <View>
        <FlatList
            data={data}
            renderItem={itemData => (
                <View>
                    <TouchableOpacity onPress={() => { updataData(itemData.item.duration, itemData.item.uri); itemData.item.step = itemData.item.step   1 }} >
                    </TouchableOpacity>
                </View>
            )}
        />
    </View>
    )
 

Это не тот код, с которым я работаю, но мне нужно научиться изменять значения ItemData.item в функции вне элемента отображения плоского списка. Как я могу это сделать?

Ответ №1:

Для этого вы должны использовать состояние (или другой поток управления состоянием; например, redux) Использование состояния:

 const initialData = [
    { duration: null, uri: null, step: 0, index: 0 }
    { duration: null, uri: null, step: 0, index: 1 }
    { duration: null, uri: null, step: 0, index: 2 }
    { duration: null, uri: null, step: 0, index: 3 }
]

const [data, setData] = useState(initialData)

const updataData = (duration, uri) => {
    duration = 1000;
    uri = 'jsdbbsljv_sjk_jka'
}

const updateItem = (item, index) => {
  const updatedUri = "something here"
  data[index] = {
  ...item,
  uri: updatedUri
  }
  setData(data)
  
}


const renderItem = ({item, index}) => {
  return (
  <View>
    <TouchableOpacity 
       onPress={() => updateItem(item, index)}               
    >
   </TouchableOpacity>
   </View>
  )
 }

return (
    <View>
        <FlatList
            data={data}
            renderItem={renderItem}
        />
    </View>
    ) 

Ответ №2:

Сохраняя данные в состоянии, мы можем вносить в них изменения динамически.

Мы просто можем передать индекс элемента в реквизитах и обновить состояние данных по конкретному индексу.

например

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

const App = () => {
  const [data, setData] = useState([
    { duration: null, uri: null, step: 0, index: 0 },
    { duration: null, uri: null, step: 0, index: 1 },
    { duration: null, uri: null, step: 0, index: 2 },
    { duration: null, uri: null, step: 0, index: 3 }
  ]);

  const updataData = (index, duration, uri) => {
    setData((prevData) => {
      return prevData.map((item) => {
        if (item.index === index) {
          return {
            ...item,
            duration: 1000,
            uri: "jsdbbsljv_sjk_jka"
          };
        }
        return {
          ...item
        };
      });
    });
  };

  return (
    <View>
      <FlatList
        data={data}
        renderItem={(itemData) => (
          <View>
            <TouchableOpacity
              onPress={() => {
                updataData(
                  itemData.item.index,
                  itemData.item.duration,
                  itemData.item.uri
                );
                itemData.item.step = itemData.item.step   1;
              }}
            >
              <Text>{itemData.item.duration || itemData.item.index}</Text>
            </TouchableOpacity>
          </View>
        )}
      />
    </View>
  );
};

export default App;