dohooo / react-native-reanimated-table

📊 A React Native table component using react-native-reanimated and react-native-gesture-handler.
MIT License
147 stars 3 forks source link

fix width content #21

Open HinPi opened 1 week ago

HinPi commented 1 week ago

can a column fix width based on length content?

dosubot[bot] commented 1 week ago

@HinPi Hello there! I'm a bot designed to help you with bugs, questions, and contributions. I'm here to assist you while waiting for a human maintainer.

Yes, a column can have a fixed width based on the length of its content. You can achieve this by using the widthArr property in the Row component to specify the width for each column.

Here is an example:

import React, { Component } from 'react';
import { StyleSheet, View, ScrollView } from 'react-native';
import { Table, TableWrapper, Row } from 'react-native-reanimated-table';

export default class ExampleThree extends Component {
  constructor(props) {
    super(props);
    this.state = {
      tableHead: ['Head', 'Head2', 'Head3', 'Head4', 'Head5', 'Head6', 'Head7', 'Head8', 'Head9'],
      widthArr: [40, 60, 80, 100, 120, 140, 160, 180, 200]
    }
  }

  render() {
    const state = this.state;
    const tableData = [];
    for (let i = 0; i < 30; i += 1) {
      const rowData = [];
      for (let j = 0; j < 9; j += 1) {
        rowData.push(`${i}${j}`);
      }
      tableData.push(rowData);
    }

    return (
      <View style={styles.container}>
        <ScrollView horizontal={true}>
          <View>
            <Table borderStyle={{borderWidth: 1, borderColor: '#C1C0B9'}}>
              <Row data={state.tableHead} widthArr={state.widthArr} style={styles.header} textStyle={styles.text}/>
            </Table>
            <ScrollView style={styles.dataWrapper}>
              <Table borderStyle={{borderWidth: 1, borderColor: '#C1C0B9'}}>
                {
                  tableData.map((rowData, index) => (
                    <Row
                      key={index}
                      data={rowData}
                      widthArr={state.widthArr}
                      style={[styles.row, index%2 && {backgroundColor: '#F7F6E7'}]}
                      textStyle={styles.text}
                    />
                  ))
                }
              </Table>
            </ScrollView>
          </View>
        </ScrollView>
      </View>
    )
  }
}
const styles = StyleSheet.create({
  container: { flex: 1, padding: 16, paddingTop: 30, backgroundColor: '#fff' },
  header: { height: 50, backgroundColor: '#537791' },
  text: { textAlign: 'center', fontWeight: '100' },
  dataWrapper: { marginTop: -1 },
  row: { height: 40, backgroundColor: '#E7E6E1' }
});

In this example, the widthArr property is used to set the width of each column in the table. Adjust the values in the widthArr array to match the desired width based on the content length [1].

To continue talking to Dosu, mention @dosu.

HinPi commented 1 week ago

What I mean is that the column length adjusts to the content length, not hardcode length

dosubot[bot] commented 1 week ago

To make a column's width adjust dynamically based on the content length in a React Native table using the react-native-reanimated-table library, you can use the flexArr property instead of the widthArr property. The flexArr property allows you to specify the flex value for each column, which will make the columns adjust their width based on the content.

Here is an example of how you can achieve this:

import React, { Component } from 'react';
import { StyleSheet, View } from 'react-native';
import { Table, TableWrapper, Row, Rows } from 'react-native-reanimated-table';

export default class DynamicWidthTable extends Component {
  constructor(props) {
    super(props);
    this.state = {
      tableHead: ['Head', 'Head2', 'Head3', 'Head4'],
      tableData: [
        ['1', '2', '3', '4'],
        ['a', 'b', 'c', 'd'],
        ['1', '2', '3', '456\n789'],
        ['a', 'b', 'c', 'd']
      ]
    }
  }

  render() {
    const state = this.state;
    return (
      <View style={styles.container}>
        <Table borderStyle={{borderWidth: 2, borderColor: '#c8e1ff'}}>
          <Row data={state.tableHead} style={styles.head} textStyle={styles.text} flexArr={[1, 2, 1, 1]}/>
          <Rows data={state.tableData} textStyle={styles.text} flexArr={[1, 2, 1, 1]}/>
        </Table>
      </View>
    )
  }
}

const styles = StyleSheet.create({
  container: { flex: 1, padding: 16, paddingTop: 30, backgroundColor: '#fff' },
  head: { height: 40, backgroundColor: '#f1f8ff' },
  text: { margin: 6 }
});

In this example, the flexArr property is used to specify the flex values for each column in the Row and Rows components. This will make the columns adjust their width dynamically based on the content length [1][2].

To continue talking to Dosu, mention @dosu.

HinPi commented 1 week ago

when i use flexArr={[1, 2, 1, 1]}, tableData disappear

dosubot[bot] commented 1 week ago

To fix the issue where the tableData disappears when using the flexArr={[1, 2, 1, 1]} property, ensure that the flexArr property is correctly applied to both the Row and Rows components. Additionally, consider using the widthArr property for better control over column widths.

Here is an example:

import React, { Component } from 'react';
import { StyleSheet, View, SafeAreaView } from 'react-native';
import { Table, Row, Rows } from 'react-native-reanimated-table';
import { ScrollView, GestureHandlerRootView } from 'react-native-gesture-handler';

export default class Example extends Component {
  constructor(props) {
    super(props);
    this.state = {
      tableHead: ['Head', 'Head2', 'Head3', 'Head4'],
      tableData: [
        ['1', '2', '3', '4'],
        ['a', 'b', 'c', 'd'],
        ['1', '2', '3', '456\n789'],
        ['a', 'b', 'c', 'd']
      ],
      widthArr: [40, 80, 40, 40]
    }
  }

  render() {
    const state = this.state;
    return (
      <GestureHandlerRootView style={styles.gestureHandlerRootView}>
        <SafeAreaView style={styles.container}>
          <ScrollView horizontal={true} showsHorizontalScrollIndicator={false}>
            <View>
              <Table borderStyle={styles.tableBorder}>
                <Row
                  data={state.tableHead}
                  widthArr={state.widthArr}
                  style={styles.header}
                  textStyle={styles.text}
                />
              </Table>
              <ScrollView style={styles.dataWrapper} showsVerticalScrollIndicator={false}>
                <Table borderStyle={styles.tableBorder}>
                  {state.tableData.map((rowData, index) => (
                    <Row
                      key={index}
                      data={rowData}
                      widthArr={state.widthArr}
                      style={[
                        styles.row,
                        index % 2 ? styles.rowConditionalBackground : {},
                      ]}
                      textStyle={styles.text}
                    />
                  ))}
                </Table>
              </ScrollView>
            </View>
          </ScrollView>
        </SafeAreaView>
      </GestureHandlerRootView>
    )
  }
}

const styles = StyleSheet.create({
  gestureHandlerRootView: {
    flex: 1,
  },
  tableBorder: {
    borderWidth: 1,
    borderColor: '#C1C0B9',
  },
  container: { flex: 1, padding: 16, backgroundColor: '#fff' },
  header: {
    height: 50,
    backgroundColor: '#537791',
    alignItems: 'center',
    justifyContent: 'center',
  },
  text: { textAlign: 'center', fontWeight: '500', color: '#1C1C1C' },
  dataWrapper: { marginTop: -1 },
  row: {
    height: 40,
    backgroundColor: '#E7E6E1',
    alignItems: 'center',
    justifyContent: 'center',
  },
  rowConditionalBackground: {
    backgroundColor: '#F7F6E7',
  },
});

In this example, the widthArr property is used to define the width of each column, ensuring that the columns are correctly sized and the data is displayed properly [1][2].

To continue talking to Dosu, mention @dosu.