2017-07-14 34 views
1

更新#2:我發佈的代碼在JSFiddle LinksScreenTimelineDay。對不起,我沒有那麼早做!React渲染道具數據按鈕在React

UPDATE:我重新構建我的代碼使用的建議。我現在嘗試更新timelineData,在組件TimelineDay的道具和重新渲染LinksScreen類。但是,我的測試沒有任何反應。我對州/道具非常陌生,所以任何建議都會非常感謝。

很新的反應/ JS(新手警報)。讓我們來看看我的問題的肉部分..


LinksScreen包含道具和Flexbox的意見外部組件

import TimelineDay from '../components/TimelineDay.js'; 

export default class LinksScreen extends React.Component { 
constructor() { 
    super(); 

    this.onPress1 = this.onPress1.bind(this); 
    this.onPress2 = this.onPress2.bind(this); 
    this.onPress3 = this.onPress3.bind(this); 

    this.state = { 
     dayOne: [ . . ], 
     dayTwo: [. . ], 
     dayThree: [. . ], 
    } 
} 

按鈕頭具有自定義onPressX功能更新timelineData道具與對應dayOnedayTwodayThree數據。

render() { 
    return (
     <View style={styles.container}> 
     <View style={styles.dayBar}> 
      <TouchableHighlight onPress={this.onPress1}> 
       <View> 
        <MaterialCommunityIcons name="numeric-1-box-outline" size={34} color="#FFD344"/> 
        <Text style={styles.day1Text}>Fri, 29th</Text> 
       </View> 
      </TouchableHighlight> 
      </View> 

這些是對應的按鈕的功能重新分配子丙timelineData與適當的陣列

onPress1 =() => { 
    this.setState({timelineData: this.state.dayOne}) 
}; 
onPress2 =() => { 
    this.setState({timelineData: this.state.dayTwo}) 
}; 
onPress3 =() => { 
    this.setState({timelineData: this.state.dayThree}) 
}; 

我猜測,通過調用的setState(),重新繪製也被稱爲。然而,這是我有困難遵守在我的測試..

這是一個包含了TimelineDay組件和timelineData道具,我希望在點擊按鈕已經重新呈現和道具重新分配的方法是什麼。

<View style={styles.eventScheduleView}> 
    <TimelineDay ref={(timelineData) => { 
     timelineData = this.state.timelineData}}> 
    </TimelineDay> 
</View> 

這可能是一個非常補救的問題,但我(和我大學的黑客馬拉松領導小組)需要額外的澄清。

隨意扔出去,將是有幫助的任何資源(流量,狀態等)。謝謝!

+0

你可以發佈完整的代碼爲兩個組件,整齊地標記,所以每個人都知道他們在看什麼?否則我們猜測。此外,不知道你爲什麼使用參考。如果您重新格式化代碼,我可以提供更多幫助。不要將組件分成不同的代碼段,只需發佈​​兩個片段,父組件(LinkScreens)和子組件(TimelineDay)。 –

+0

如果你是React的全新品牌,如果你嘗試使用Redux之類的東西,你的頭腦也會蒸發成一致的湯。 –

+0

對不起!看看我最近的更新。我爲每個@ daniel-zuzevich鏈接了JSFiddles –

回答

0
this.state= { 
    whatDay: props.string 
}; 

你想在這裏設置的初始狀態爲您的組件,不知道你打算與props.string做什麼,你可以將其設置爲空字符串。

「測試動作onPress到道具更新......」,其實你要更新狀態,道具不能使用的setState更新。

花多一點時間回顧一下基本面反應會對你有所幫助。

0

有你在這裏做一些事情是有點怪。我會冒險猜測你的按鈕爲whataday2的作品。

<TouchableHighlight onPress={{whatDay: "dayOne"}}> 

<TouchableHighlight onPress={{whatDay: "dayThree"}}> 

都沒有做,除了把一個物體進入onPress與物業什麼 'whatDay'。然而這個按鈕傳遞你創建的實際功能,這是正確的方法。

<TouchableHighlight onPress={this.onPress}> 

此外,也沒有必要在你的onPress函數返回的setState,這些touchables都只是執行onPress按鈕調用什麼。如果你。有兩種方法可以正確執行此操作,第一種方法是爲每個「每日」呼叫創建單個onPress呼叫,就像這樣。

onPressTwo =() => { 
    this.setState({ 
    whatDay: "dayTwo" 
    }); 
}; 

onPressThree =() => { 
    this.setState({ 
    whatDay: "dayThree" 
    }); 
}; 
.... 

並將每個按鈕傳遞給它們各自的按鈕。或者,您可以在每個按鈕中綁定onPress,並使onPress獲取一個變量。

onPress = (day) => { 
    this.setState({ 
    whatDay: day 
    }); 
}; 

這樣結合。

<TouchableHighlight onPress={this.onPress.bind(this, "dayThree"}> 

你應該看看施加至少通量或終極版模式,流量更容易被小事回暖。使用這些模式之一將允許將所有狀態存儲在與組件無關的地方,從而使事情更容易管理。

+0

減少邏輯之後,我建立了三個單獨的onPress動作: this.onPress1 = this.onPress1.bind(this); this.onPress2 = this.onPress2.bind(this); this.onPress3 = this.onPress3.bind(this); 每個 'onPress' 功能將嘗試設置''Timeline'子timelineData'用適當的陣列支撐(在父this.state定義): this.state = { dayTwo:[..], dayThree: ..], } 然後設置'timelineData'道具: onPress1 =()=> { this.setState({timelineData:this.state.dayOne}) –

+0

很抱歉的未格式化的評論,仍然習慣的StackOverflow 。我編輯了我的原始文章以包含您的架構建議。如果你有時間我很樂意讓你回顧一下。謝謝! –

+0

您將timelineData傳遞給ref,該屬性的目的僅僅是引用該組件,而不傳遞它的數據。設置狀態確實會導致重新渲染,但如果數據未放置在可見的位置,則不會改變。把數據放在'this'而不是state,並且只從這裏更新狀態也是更好的選擇。國家應該保留,只會導致明顯的變化。通常,flux或者redux可以解決這個問題。 –