代码之家  ›  专栏  ›  技术社区  ›  Nauman Tanwir

React Native:如何将组件中的项与另一个组件中的项绑定?

  •  0
  • Nauman Tanwir  · 技术社区  · 6 年前

    我正在尝试使用 react-native-calendars library by wix . 例如,当我点击2018年12月5日 Calendar Component ,应导航至2018年12月5日 Agenda Component . 这就是我想做的。

    这是我的密码 日历组件

        class Calendar extends Component {
        constructor(props) {
            super(props);
             this.state = {
                 active: 'true'
             }
        }
    
        render() { 
            const {onSelect} = this.props;
            return ( 
                <View>
                    <CalendarList 
                        keyExtractor = {day=>day.id}
                        onDayPress={(day) => {onSelect.bind(this, day)}}
                        pastScrollRange={12}
                        futureScrollRange={12}
                        scrollEnabled={true}
                        showScrollIndicator={true}
                    />
                </View>
             );
        }
    }
    
    Calendar.propTypes = {
        onSelect: PropTypes.func,
    }
    

    这是我的密码 CalendarScreen 我在哪里做导航。

    const CalendarScreen = ({navigation}) => (
        <View >
            <Calendar  navigation={navigation} 
                onSelect={(id)=>{
                navigation.navigate('Agenda', {id}) }}>
                <StatusBar backgroundColor="#28F1A6" />
            </Calendar >
        </View>
    );
    
    Calendar.propTypes = {
        navigation: PropTypes.object.isRequired
    }
    
    export default CalendarScreen;
    

    我还提到了解决办法 here

    议程部分

        class WeeklyAgenda extends Component {
        constructor(props) {
        super(props);
        this.state = {
          items: {}
        };
      }
    
      render() {
        return (
            <View style={{height:600}}>
                 <Agenda
                    items={this.state.items}
                    loadItemsForMonth={this.loadItems.bind(this)}
                    selected={Date()}
                    renderItem={this.renderItem.bind(this)}
                    renderEmptyDate={this.renderEmptyDate.bind(this)}
                    rowHasChanged={this.rowHasChanged.bind(this)}
                    onRefresh = {() => { this.setState({refeshing : true})}}
                    refreshing = {this.state.refreshing}
                    refreshControl = {null}
                    pastScrollRange={1}
                    futureScrollRange = {3}
                />
        );
      }
    

    AgendaScreen

        const AgendaScreen = ({navigation}) => (
        <View style={{height: 100}}>
            <WeeklyAgenda  navigation={navigation}>
                <StatusBar backgroundColor="#28F1A6" />
            </WeeklyAgenda >
        </View>
    );
    
    WeeklyAgenda.propTypes = {
        navigation: PropTypes.object.isRequired
    }
    
    export default AgendaScreen;
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Benjamin Scherer    6 年前

    日历屏幕只需要调用onSelect(天)。

    onDayPress={(day) => {onSelect(day)}}
    

    或者让回调同时接受导航对象和日期

    onDayPress={(day) => {onSelect(day, navigation)}}
    

    日历现在应该设置好了

    onSelect={(day, navigation)=>{
            navigation.navigate('Agenda', {day}) }}>
    

    或者,当您将导航对象传递给日历时,为什么要传递回调

    onDayPress={(day) => {this.props.navigation.navigate('Agenda', {day})}}
    

    同样的问题。onSelect导航到AgentScreen并将导航道具(其中包含day对象)传递给它,然后AgentScreen将导航道具传递给WeeklyAgent,但WeeklyAgent不使用导航道具获取id。

    selected={Date()}
    

    创建具有今天日期的新日期对象。 要获得正确的日期,您需要从导航中获得日期,通常是沿着

    this.props.navigation.state.params["day"]
    

    现在,如果WeeklyAgenda不进一步使用导航,我不会通过它。

    相反,每周议程应该有一个道具“日”,因此

     <WeeklyAgenda  navigation={navigation}>
    

    尝试

    const { params } = this.props.navigation.state;
    ...
    <WeeklyAgenda  day={params["day"}>
    

    第一行将params对象从state解压到一个名为params的变量中。

    selected={this.props.day}
    

    我认为这里的问题根本不在于装订。 我建议你读这本书 article 或者另一个关于绑定的功能。