bootstrap 当下拉列表里面很多项的时候,怎么让下拉列表出现滚动框而不是整个页面出现滚动框?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bootstrap 当下拉列表里面很多项的时候,怎么让下拉列表出现滚动框而不是整个页面出现滚动框?相关的知识,希望对你有一定的参考价值。

如图:bootstrap怎么让下拉列表里面出现滚动条而不是整个页面出现滚动条呢?

<select class="selectpicker" data-control=' liveSearch: true, size:10, width:100 '
>

使用BootStrap selectpicker

第一个livesearch指是否需要搜索框

第二个size就是选项数,超出的出滚动条

第三个width是下拉按钮的宽度

参考技术A 1、给 类别1/2/3... 所处容器设置高度限制(如 style="height: 400px; overflow: scroll;");
2、更合适的做法也许是将类别拆分成 2 层或更多子类别,太长的列表用户体验也许不是最好;本回答被提问者和网友采纳

当下拉列表的值发生变化时,如何重新渲染 Flatlist?

【中文标题】当下拉列表的值发生变化时,如何重新渲染 Flatlist?【英文标题】:How do you re-render Flatlist when value of dropdown list changes? 【发布时间】:2020-10-16 16:25:13 【问题描述】:

我正在从状态变量 this.state.dataSource 中的 Componentdidmount 中的数据库中获取一个数组

componentDidMount()

    fetch("http://docbook.orgfree.com/home.php", 
      method: "GET",
      headers: 
        Accept: "application/json",
        "Content-Type": "application/json",
        "auth-token": "my token",
      ,
    )
      .then((response) => response.json())
      .then((responseJson) => 
        this.setState(
          isLoading: false,
          dataSource: responseJson, 

        );
        if (responseJson) 
          Alert.alert("Id is" + JSON.stringify(responseJson)); 
        // this.state.dataSource = this.state.dataSource.filter(x => x.Tag === this.state.text);
        // console.log(this.state.dataSource[0])
         
         else if (responseJson.error) 
          Alert.alert(responseJson.error);
        
      )

      .catch((error) => 
        console.error(error);
      );

    

this.state.Datasource 包含一个数组,如:

[ 描述:“kjs”, 标签:“海滩”, 名称:“nkslk”, 地点:“kdlk”, 图片:“kgmls” , 描述:“knsldk”, 标签:“俱乐部”, 名称:“nklf”, 地点:“dlk”, 图片:“nkxn” , ]

我有一个下拉列表,其中包含我的数据库中不同标签的值,例如 海滩、俱乐部、寺庙、堡垒等

我只想在我的平面列表中呈现标签与我的数组中的标签匹配的那些项目,并且当下拉值更改时我想将我的平面列表重新呈现为具有新标签的数组元素

我的完整源码:

import React,  Component  from "react";
import  Dropdown  from 'react-native-material-dropdown';
import  Button, View, Text, StyleSheet, Image ,Alert,FlatList from "react- 
native";
class explore extends Component 
    constructor(props) 
       super(props);
        this.state = 
        tag: '',
       isLoading:true,
       dataSource:[]
    ;


componentDidMount()

    fetch("http://docbook.orgfree.com/home.php", 
      method: "GET",
      headers: 
        Accept: "application/json",
        "Content-Type": "application/json",
        "auth-token": "my token",
      ,
    )
      .then((response) => response.json())
      .then((responseJson) => 
        this.setState(
          isLoading: false,
          dataSource: responseJson, 

        );
        if (responseJson) 
          // Alert.alert("Id is" + JSON.stringify(responseJson)); 
          console.log(this.state.dataSource)
         
         else if (responseJson.error) 
          // Alert.alert(responseJson.error);
        
      )

      .catch((error) => 
        console.error(error);
      );

    


render() 
    const  dataSource, tag  = this.state;

    const tagFilter = item => 
          if (tag) 
            return item.tag === tag;
          
          return true;
    
    let data = [
      value: 'Church',
    , 
      value: 'Beach',
    , 
      value: 'Temple',
    ,
      value:'Waterfall' 
    ,
    
      value:'Town'
    ];
    
return (    
      <View>
        <Dropdown
            label='TAG'
            data=data
            onChangeText=tag => this.setState( tag )
        />
        <FlatList
          data=dataSource.filter(tagFilter)
          ItemSeparatorComponent=this.FlatListItemSeparator
          renderItem=( item ) => (
            <View >
              <Text >item.name</Text>
              <Text >#item.Tag</Text>

             
            </View>
          )
          keyExatractor=( name ) => name
        />


      </View>

);


export default explore;

【问题讨论】:

【参考方案1】:

保存标签以在状态中过滤并简单地过滤您的数据源内联与下拉组件的 onChange 回调。下面从状态中解构tagdataSource,并定义一个过滤函数用作array::filter 回调。如果tag 为真,则在标签匹配时应用过滤器,否则返回真以允许通过项目,即未过滤。

this.state = 
  text: 'Temple',
  isLoading: true,
  dataSource: [], // <-- provide defined initial state
  tag: '', // <-- tag
;

...

render() 
  let data = [
      value: 'Church',
    , 
      value: 'Beach',
    , 
      value: 'Temple',
  ];

  const  dataSource, tag  = this.state; // <-- destructure

  const tagFilter = item =>  // <-- filter callback
    if (tag) 
      return item.tag.toLowerCase() === tag.toLowerCase(); // <-- compare using lowercase!
    
    return true;
  

  return (    
    <View>
      <Dropdown
        label='TAG'
        data=data
        onChangeText=tag => this.setState( tag ) // <-- save tag to state
      />
      <FlatList
        data=dataSource.filter(tagFilter) // <-- filter data
        ItemSeparatorComponent=this.FlatListItemSeparator
        renderItem=( item ) => (
          <View >
            <Text >item.name</Text>
            <Text >#item.Tag</Text>
          </View>
        )
      />
    </View>
  );

【讨论】:

TypeError:undefined is not an object (evalating dataSource.filter) @Akashkunwar 你是否从状态对象中解构了dataSource?我会更新答案,以便更清楚地了解更改的去向。 @Akashkunwar 已更新。附加说明,由于底层数据正在更改,并且FlatList 默认使用索引,如果数据没有key 属性或者您没有指定keyExtractor,您可能会遇到渲染问题,只是一个警告。希望这更清楚一点。 我已经根据您所做的更改更新了我的代码,但我仍然收到 TypeError: undefined is not an object (evalating dataSource.filter) 而且我认为没有任何渲染问题因为它在不同的活动中渲染得很好。 我也更新了我的问题,如果您可以查看更新后的代码,这将非常有帮助

以上是关于bootstrap 当下拉列表里面很多项的时候,怎么让下拉列表出现滚动框而不是整个页面出现滚动框?的主要内容,如果未能解决你的问题,请参考以下文章

ReactStrap:当下拉列表很长时,用户看不到最后的值

当下拉列表的值发生变化时,如何重新渲染 Flatlist?

无法一键重新打开下拉列表

状态更改后的 Bootstrap Dropdown 更新位置

Bootstrap 3:减少列表组中列表组项的高度

当下拉列表中的“选择”更改时,按 ID 填充表 TD