反应本机列表视图

Posted

技术标签:

【中文标题】反应本机列表视图【英文标题】:React Native List View 【发布时间】:2017-08-18 01:35:00 【问题描述】:

我正在尝试在 react native 中创建一个 Listview,每一行都有一个复选框和一个正文。为此,我使用的是 nativebase 包。 http://nativebase.io/docs/v2.0.0/components#checkbox

我有一些问题,当我单击复选框时,复选框不会将状态更改为 false。单击复选框时如何从正文中获取值?

import React,  Component  from 'react';
import  Container, Content, List, Body, ListItem, Text, CheckBox  from 'native-base';

class ListExample extends Component 
  state = 
    pressed: true,
    value: ""
  ;

  onCheckBoxPress() 
    console.log(this);
    this.setState( pressed: false);
    this.setState( value: BODYVALUE);
  

  render() 
    var items = [ "test1", "test2", "test3", "test4", "test5", "test6" ];
    return (
      <Container>
      <Content>
          <List dataArray=items renderRow=(data) =>
              <ListItem>
                <CheckBox onPress=this.onCheckBoxPress.bind(this) checked=this.state.pressed />
                <Body>
                  <Text>data</Text>
                </Body>
              </ListItem>
           />
      </Content>
  </Container>
    );
  


export default ListExample;

【问题讨论】:

我也有同样的问题,有什么解决办法吗? 【参考方案1】:

除非给定新数据,否则我不相信列表会重新呈现,请尝试这样做:

class ListExample extends Component 
  state = 
    pressed: true,
    value: ""
    list: [ "test1", "test2", "test3" ]
  ;

  onCheckBoxPress = (value) => 
    console.log(this);
    this.setState( pressed: false, value, list: ["test4", "test5", "test6"]);
  

  render() 
    return (
      <Container>
      <Content>
          <List dataArray=this.state.list renderRow=(data) =>
              <ListItem>
                <CheckBox onPress=() => this.onCheckBoxPress(data) checked=this.state.pressed />
                <Body>
                  <Text>data</Text>
                </Body>
              </ListItem>
           />
      </Content>
  </Container>
    );
  

【讨论】:

当我点击复选框时,我收到错误“列表未定义”:/@Matt Aft 哦语法错误,改成:this.setState( pressed: false, value, list: ["test4", "test5", "test6"]);【参考方案2】:

我遇到了类似的问题,在我的情况下,我需要保存所选行的 ID,这是适用的解决方案。

import React,  Component  from 'react';
import 
  StyleSheet,
  View,
  ListView
 from 'react-native';
import  typography  from 'react-native-material-design-styles';
import  Container, Content, Item, List, CheckBox, Body, ListItem, Text  from 'native-base';
import ItemLot from './item.js';

export default class LotsListDevolutionClient extends Component 
  state =  
    lots: [
      
        id: 1,
        serie: 'sorteo',
        almacen: 'principal',
        inicio: 1,
        fin: 50
      ,
      
        id: 2,
        serie: 'sorteo',
        almacen: 'principal',
        inicio: 51,
        fin: 100
      
    ],
    selectedLots: [],
    token: ''
  ;

  onCheckBoxPress(id) 
    let tmp = this.state.selectedLots;

    if ( tmp.includes( id ) ) 
      tmp.splice( tmp.indexOf(id), 1 );
     else 
      tmp.push( id );
    

    this.setState(
      selectedLots: tmp
    );
    console.warn('selected: ', this.state.selectedLots)
  

  _renderItem(item)
    return (
      <View style=styles.row>
        <CheckBox checked=item.check onPress=() => this.onCheck(item) />
        <Item lot=item/>
      </View>
    )    
  

  render() 
    const ds = new ListView.DataSource(rowHasChanged: (r1, r2) => r1 !== r2)
    return (
      <Container>
        <Content style=styles.content>
          <Text style=[typographyStyle.paperFontTitle, alignSelf: 'center']>Seleccione los lotes</Text>
          <Item>
            <ListView
              enableEmptySections=true 
              dataSource=ds.cloneWithRows(this.state.lots)
              renderRow=(item) =>
                <ListItem style=styles.listItem>
                  <CheckBox
                    checked=this.state.selectedLots.includes(item.id) ? true : false
                    onPress=()=>this.onCheckBoxPress(item.id)
                  />
                  <ItemLot lot=item/>
                </ListItem>
              
            />
          </Item>
        </Content>
      </Container>
    );
  


const styles = StyleSheet.create(
  container:  
    flex: 1,
    backgroundColor: 'white'
  ,
  row:
    flexDirection: 'row',
   justifyContent: 'flex-start'
  ,
  listItem: 
    backgroundColor: '#DFDFDF',
    elevation: 5,
    margin: 4
  ,
  content: 
    flexDirection: 'column'
  
);

const typographyStyle = StyleSheet.create(typography);

【讨论】:

以上是关于反应本机列表视图的主要内容,如果未能解决你的问题,请参考以下文章

反应本机列表视图添加项目不起作用

如何在本机反应中为整个应用程序(如每个屏幕)在屏幕底部显示自定义视图

如何从 postgresql 视图表中获取要显示的对象列表

从视图表中获取数据时出现 Laravel 错误

如何在本机反应中设置 FlatList 的刷新指示器?

如何在本机反应中使用饼图