You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native电影应用如何实现下拉菜单排序功能?

实现电影列表的排序下拉菜单

你的现有代码存在几个核心问题:

  • SelectList 的 data 传入了电影列表,下拉菜单应该展示排序选项而非电影数据
  • onSelect 绑定了搜索过滤函数,与排序逻辑不匹配
  • FlatList 直接使用原始 data,没有展示排序后的结果

以下是完整的解决方案:

步骤1:定义排序选项

先创建下拉菜单的选项数组,适配react-native-dropdown-select-list的格式要求:

const sortOptions = [
  { key: 'newest', value: '按最新排序' },
  { key: 'oldest', value: '按最旧排序' },
  { key: 'random', value: '随机排序' }
];

步骤2:调整状态管理

新增状态记录当前排序类型,同时确保数据加载完成后正确初始化列表:

const { data, loading } = useFetch();
const [list, setList] = useState([]);
const [selectedSort, setSelectedSort] = useState('newest'); // 默认按最新排序
const [searchText, setSearchText] = useState(''); // 维护搜索文本状态

步骤3:编写排序+过滤逻辑

将排序和搜索过滤结合,确保排序后的数据也能应用搜索规则(假设电影数据包含release_date日期字段,可根据实际字段替换):

const sortMovies = (sortType) => {
  if (!data || data.length === 0) return;
  
  let sortedData = [...data]; // 复制原始数据,避免修改原数组

  switch (sortType) {
    case 'newest':
      // 按发布日期降序(最新在前)
      sortedData.sort((a, b) => new Date(b.release_date) - new Date(a.release_date));
      break;
    case 'oldest':
      // 按发布日期升序(最旧在前)
      sortedData.sort((a, b) => new Date(a.release_date) - new Date(b.release_date));
      break;
    case 'random':
      // 随机打乱数组
      sortedData.sort(() => Math.random() - 0.5);
      break;
    default:
      break;
  }

  // 排序后应用搜索过滤
  if (searchText) {
    sortedData = sortedData.filter(item => 
      item.title.toLowerCase().includes(searchText.toLowerCase())
    );
  }

  setList(sortedData);
};

步骤4:监听状态变化自动更新列表

使用useEffect监听数据加载完成、排序类型变化,自动触发排序逻辑:

useEffect(() => {
  sortMovies(selectedSort);
}, [data, selectedSort]);

完整修改后的代码

import React, { useState, useEffect } from 'react';
import { View, TextInput, FlatList, ActivityIndicator, Text } from 'react-native';
import useFetch from '../../components/Hooks/useFetch';
import styles from './Sorting.style';
import { SelectList } from 'react-native-dropdown-select-list'

const Sorting = () => {
  const { data, loading } = useFetch();
  const [list, setList] = useState([]);
  const [selectedSort, setSelectedSort] = useState('newest');
  const [searchText, setSearchText] = useState('');

  // 排序选项
  const sortOptions = [
    { key: 'newest', value: '按最新排序' },
    { key: 'oldest', value: '按最旧排序' },
    { key: 'random', value: '随机排序' }
  ];

  // 排序+过滤逻辑
  const sortMovies = (sortType) => {
    if (!data || data.length === 0) return;
    
    let sortedData = [...data];

    switch (sortType) {
      case 'newest':
        sortedData.sort((a, b) => new Date(b.release_date) - new Date(a.release_date));
        break;
      case 'oldest':
        sortedData.sort((a, b) => new Date(a.release_date) - new Date(b.release_date));
        break;
      case 'random':
        sortedData.sort(() => Math.random() - 0.5);
        break;
      default:
        break;
    }

    // 应用搜索过滤
    if (searchText) {
      sortedData = sortedData.filter(item => 
        item.title.toLowerCase().includes(searchText.toLowerCase())
      );
    }

    setList(sortedData);
  };

  // 搜索输入处理
  const handleFilter = (text) => {
    setSearchText(text);
    sortMovies(selectedSort); // 搜索时重新执行排序+过滤
  };

  // 自动更新列表
  useEffect(() => {
    sortMovies(selectedSort);
  }, [data, selectedSort]);

  if (loading) {
    return <ActivityIndicator style={{flex: 1, justifyContent: "center"}} size="large" />
  }

  const renderMovies = ({item}) => <Text style={styles.movieTitle}>{item.title}</Text>

  return (
    <View style={styles.container}>
      {/* 搜索输入框 */}
      <TextInput
        style={styles.searchInput}
        placeholder="搜索电影"
        value={searchText}
        onChangeText={handleFilter}
      />
      {/* 排序下拉菜单 */}
      <SelectList 
        placeholder='排序' 
        onSelect={(value) => setSelectedSort(value)}
        setSelected={setSelectedSort}
        data={sortOptions}
        save="key"
        style={styles.selectList}
      />
      {/* 电影列表 */}
      <FlatList
        numColumns={2}
        horizontal={false}
        data={list}
        renderItem={renderMovies}
        keyExtractor={(item) => item.id.toString()}
        contentContainerStyle={styles.listContainer}
      />
    </View>
  )
}

export default Sorting;

关键说明

  • 排序与搜索逻辑绑定:确保搜索结果始终是排序后的状态
  • 添加keyExtractor:解决FlatList的key警告问题
  • 若你的电影数据没有release_date字段,替换为实际日期字段(如releaseYear)并调整排序逻辑即可

内容的提问来源于stack exchange,提问作者Emre Can Akyol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 04:10:13