【问题标题】:Make react-native-paper DataTable full width使 react-native-paper DataTable 全宽
【发布时间】:2022-11-11 05:35:05
【问题描述】:

我正在使用 react-native-paper DataTable 在 react-native 中创建日历。但是,我似乎无法让桌子占据 100% 的宽度,如图所示:

我有这样的基本设置:

            <DataTable>
                <DataTable.Row>
                    {weeks.map((day, index) => (
                        <DataTable.Cell >
                            <Text
                                key={`week-day-${index}`}
                            >
                            {dayjs(day).format("dd")}
                            </Text>
                        </DataTable.Cell>
                    ))}
                </DataTable.Row>
                {weeks.map((week, weekIndex) => (
                    <DataTable.Row
                        key={`week-${weekIndex}`}
                    >
                        {week.map((day, dayIndex) => (
                            <DataTable.Cell
                                key={`day-${dayIndex}`}
                            >
                                <Text>{day.getDate()}</Text>
                            </DataTable.Cell>
                        ))}
                    </DataTable.Row>
                ))}
            </DataTable>

如何使单元格占用该行中的所有可用空间?

【问题讨论】:

  • 你试过给DataTable.Row一个宽度为100%的样式吗?
  • 是的,我尝试将其添加到所有元素中,但没有运气
  • 在 App.js 中,您的第一个视图是否使用 flex:1

标签: react-native expo


【解决方案1】:

我不确定为什么您的 DataTable 没有占据屏幕的整个宽度。我能想象它不这样做的唯一原因是它的宽度是否受到其父组件的限制。我开始为日历设计一些东西here

import React, { useState, useEffect, useMemo, useCallback } from 'react';
import { View, StyleSheet, SafeAreaView } from 'react-native';
import Constants from 'expo-constants';
import { Text, DataTable,} from 'react-native-paper';
import dayjs from 'dayjs';
import TableHeader from './components/TableHeader';
import TableTitle from './components/TableTitle';
import SettingsModal from './components/SettingsModal';
import {
  wrapArray,
  getCalendarMonth,
  WEEK_DAYS,
} from './helpers/utils';

const currentDay = dayjs();

const pickerItems = WEEK_DAYS.map((day, i) => {
  return {
    label: day,
    value: i,
  };
});

export default function App() {
  // allow user to decide start of week
  const [weekStart, setWeekStart] = useState(0);
  const [month, setMonth] = useState(currentDay.get('month'));
  const [year, setYear] = useState(currentDay.get('year'));
  // when a month doesnt start at the weekStart it is necessary
  // add days or blanks to put the arrays  align days with the
  // proper week day
  const [hideExtraDays, setHideExtraDays] = useState(true);
  const [days, setDays] = useState(
    getCalendarMonth(month, year, weekStart, hideExtraDays)
  );

  const { weekDays, pickerList } = useMemo(() => {
    return {
      weekDays: wrapArray(WEEK_DAYS, weekStart),
      pickerList: wrapArray(pickerItems, weekStart),
    };
  }, [weekStart]);
  // incrementing/decrementing month is the same code
  // accessing different dayjs functions
  const incrementMonth = useCallback(
    (isDecrementing) => {
      const date = dayjs(`${year}-${month + 1}-01`);
      const functionKey = isDecrementing ? 'subtract' : 'add';
      const newDate = date[functionKey](1, 'month');
      setMonth(newDate.get('month'));
      setYear(newDate.get('year'));
    },
    [month, year]
  );
  // update days when these values change
  useEffect(() => {
    setDays(getCalendarMonth(month, year, weekStart, hideExtraDays));
  }, [weekStart, month, year, hideExtraDays]);
  return (
    <SafeAreaView style={styles.container}>
      {/*modal for calendar settings */}
      <SettingsModal
        {...{
          pickerList,
          weekStart,
          setWeekStart,
          hideExtraDays,
          setHideExtraDays,
        }}
      />
      <View style={styles.calendarContainer}>
        <DataTable style={{ flex: 1 }}>
          <TableTitle
            month={month}
            year={year}
            onLeftPress={() => incrementMonth(true)}
            onRightPress={() => incrementMonth()}
            // the month and year is a pressable that when press reveal
            // dropdown flatlist picker on android this picker is unscrollable
            onDateChange={(date) => {
              setMonth(date.month);
              setYear(date.year);
            }}
          />
          {/* days of the week */}
          <TableHeader weekDays={weekDays} />
          {days.map((week, weekIndex) => (
            <DataTable.Row key={`week-${weekIndex}`}>
              {week.map((day, dayIndex) => (
                <DataTable.Cell key={`day-${dayIndex}`}>
                  {/* hideExtra days add null values when true */}
                  <Text>{day ? day.get('date') : null}</Text>
                </DataTable.Cell>
              ))}
            </DataTable.Row>
          ))}
        </DataTable>
      </View>
    </SafeAreaView>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    paddingTop: Constants.statusBarHeight,
    backgroundColor: '#ecf0f1',
    padding: 8,
  },
  calendarContainer: {
    flex: 1,
  },
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多