React Native 如何在3个不同的onPress操作后重新呈现FlatList?

zqdjd7g9  于 2023-01-14  发布在  React
关注(0)|答案(1)|浏览(154)

这个想法是有一个切换开关,从To WatchWatched预订切换,即电影中包含预订的对象有三个按钮-一个设置预订为已观看,一个设置预订为待观看,一个完全删除它们。

const WatchList = () => {

  const uid = auth.currentUser.uid;
  const docRef = doc(db, 'users', uid);
  const [user, setUser] = useState({});
  const [watched, setWatched] = useState(true);
  const [text, setText] = useState('To watch');
  const [filteredBookings, setFilteredBookings] = useState(bookings);

  const bookingsRef = collection(db, "booking"); // imamo ref ka bazi

  const [bookings, setBookings] = useState({});
   useEffect(() => {
    getUser();
    getBookings();
  },[])

  const getUser = async () => {
    const snap = await getDoc(docRef)
    setUser({user, ...snap.data()})
  }

  const getBookings = async () =>{
    const q = query(bookingsRef, where("users","array-contains",auth.currentUser.uid));
      const unsubscribe = onSnapshot(q, (querySnapshot) => {
        const a = [];
        querySnapshot.forEach((doc) => {            
        a.push(doc.data());
      });
      setBookings(querySnapshot.docs);
    });
  }

  const toggleSwitch = () =>{
    if(!watched){
      setFilteredBookings(bookings.filter(function(item){
        return item.data().watched == true;
      }))
      setText('Watched');
    } else {
      setText('To watch');
      setFilteredBookings(bookings.filter(function(item){
        return item.data().watched == false;
      }))
    }
    setWatched(previousState => !previousState);
  }

  const updateBooking = async(id) => {
    try {
      await setDoc(doc(db, 'booking', id), {
        watched: true
      }, {merge: true})
    }
    catch(e) {
      console.log(e)
    }
  }

  const updateBooking1 = async(id) => {
    try {
      await setDoc(doc(db, 'booking', id), {
        watched: false
      }, {merge: true})
    }
    catch(e) {
      console.log(e)
    }
  }

  const deleteBooking = async(id) => {
    try {
      await deleteDoc(doc(db, 'booking', id));
    }
    catch(e) {
      console.log(e)
    }
  }

  useEffect(() => {
    const resultOfFiltering = bookings
    setFilteredBookings(resultOfFiltering)
  }, [bookings])

  return (
    <View>
      <View>
        <Text>{text}</Text>
        <Switch 
          value = {watched}
        />
      </View>
  
  <FlatList
    data = {filteredBookings}

    renderItem  = {({item}) => (
      <View>
      <View>
        <Text>{item.data().movie}</Text>
        <Text>{item.data().day} - {item.data().showtime}</Text>
      </View>
      <View>
        {item.data().watched == true ? (
            <TouchableOpacity style = {styles.delete} onPress = {() => {setWatched(item.id); setFilteredBookings();}}>
            <Image source={require('../assets/watched.png')}/>
            </TouchableOpacity>
        ) : (
        <TouchableOpacity onPress = {() => {setToWatch(item.id); setFilteredBookings();}}>
        <Image source={require('../assets/towatch.png')}/>
        </TouchableOpacity>)}

        <TouchableOpacity onPress = {() => {deleteBooking(item.id); setFilteredBookings();}}>
          <Image source={require('../assets/remove.png')}/>
        </TouchableOpacity>
      </View>
      </View>
    )}
  />
      </View>
  )
}

export default WatchList

如何根据按下的按钮重新呈现FlatList?到目前为止,如果我删除了预订,FlatList会重新呈现自己,但不包含已删除的预订,但我不知道如何使用useEffect钩子来让它根据预订是否被观看来重新呈现包含添加或删除的预订的列表。

kt06eoxx

kt06eoxx1#

我不是很明白你的方法是什么,但是从我的理解来看,你想以某种方式重新呈现平面列表数据,如果它的状态改变了,对吗?
如果是,请尝试以下操作:
const [重新渲染切换,设置重新渲染切换] =使用状态(真);
在平面列表中将“rerenderToggle”设置为extraData={rerenderToggle}。
每次更改平面列表后,更改rerenderToggle的值(通过执行setrerenderToggle(!rerenderToggle))。
通过更改extraData(不管里面是什么),FlatList基本上会被告知由于数据更改而重新渲染。
我希望这能帮助你解决你的问题。
抱歉,格式化了,我在移动的上。

相关问题