2017-12-28 25 views
1

아래 코드를 가지고 있는데 의 화면 중 하나에서 Tabscreen 상태를 변경하는 것이 좋습니다. 하지만 현재 상태를 설정하는 전역 함수로,이 작업을 수행하려고 방법있는, 단순히 오류 나는이 작업을 수행 할 수있는 방법 undefined is not a function (evaluating 'this.setstate')React-native의 다른 구성 요소에서 한 구성 요소의 상태 변경

import React from 'react'; 
import {Image, Text, TouchableNativeFeedback, TouchableHighlight} from 'react-native'; 
import {TabNavigator} from 'react-navigation'; 
import {Container, Header, Icon, Left, Body} from 'native-base'; 
import Timeline from './Timeline'; 

const Mainscreen=TabNavigator(
    { 
     Main:{ 
     screen: Timeline, 
     navigationOptions:{ 
      tabBarIcon: ({tintColor}) => <Icon name='home' style={{color:tintColor}}/> 
     } 
     }, 
     Search:{ 
     screen: props => <Container><TouchableHighlight onPress={()=>globalStateUpdate()}><Container style={{backgroundColor:'rgba(0,132,180,0.5)'}}></Container></TouchableHighlight></Container>, 
     navigationOptions:{ 
      tabBarIcon: ({tintColor}) => <Icon name='search' style={{color:tintColor}}/> 
     } 
     }, 
    } 
); 

function globalStateUpdate(){ 
    this.setState({ 
    header:<Text>Search</Text> 
    }); 
} 

class Tabscreen extends React.Component { 
    constructor(props){ 
    super(props); 
    this.state={ 
     header:<Text>Home</Text> 
    }; 
    globalStateUpdate = globalStateUpdate.bind(this); 
    } 

    render() { 
    return (
     <Container> 
     <Header hasTabs > 
      <Left> 
      {this.state.header} 
      </Left> 
      <Body/> 
     </Header> 
     <Mainscreen/> 
     </Container> 
    ); 
    } 
} 

export default Tabscreen; 

으로 작동하지 않는 이유는 무엇입니까? 항법 탐색은 내 응용 프로그램에 매우 중요하며이를 제거 할 수는 없습니다. 나는 Redux가 이것을 해결할 수있는 것이라고 생각하지만, 단 하나의 텍스트 변경만으로는 너무 복잡해 보입니다. 필요한 모든 것입니다.

+0

시도''다음 화면 개체, 예 : onPress = {props.globalStateUpdate}''시도가 TabNavigator의 내부 - 나는 사과하지 않을 경우, 상기 다만 찔러 문제는 코드를 로컬에서 재현하기 전에 발생합니다. – Dan

+0

@Dan 답장을 보내 주셔서 감사합니다. 오류를 제거하지만 텍스트는 여전히 변경되지 않습니다. – AZG

+0

생성자를'this.globalStateUpdate = globalStateUpdate.bind (this);'로 변경하고''- 다음은 React https://codesandbox.io/를 사용하는 예제입니다. s/0qm840ln30 – Dan

답변

1

TabScreen의 기능을 다른 화면으로 전달하여 TabScreen 상태를 업데이트 할 수 있습니다.

const Mainscreen=TabNavigator(
    { 
     Main:{ 
      screen: Timeline, 
      navigationOptions:{ 
       tabBarIcon: ({tintColor}) => <Icon name='home' style={{color:tintColor}}/> 
      } 
     }, 
     Search:{ 
      screen: props => <Container><TouchableHighlight onPress={()=> props.screenProps.globalStateUpdate({header:<Text>Search</Text>})}><Container style={{backgroundColor:'rgba(0,132,180,0.5)'}}></Container></TouchableHighlight></Container>, 
      navigationOptions:{ 
       tabBarIcon: ({tintColor}) => <Icon name='search' style={{color:tintColor}}/> 
      } 
     }, 
    } 
); 


class Tabscreen extends React.Component { 
    constructor(props){ 
     super(props); 
     this.state={ 
      header:<Text>Home</Text> 
      globalStateUpdate: newState => this.setState(newState) 
     }; 
    } 

    render() { 
     return (
      <Container> 
       <Header hasTabs > 
        <Left> 
         {this.state.header} 
        </Left> 
        <Body/> 
       </Header> 
       <Mainscreen screenProps={{globalStateUpdate: this.state.globalStateUpdate}} /> 
      </Container> 
     ); 
    } 
} 
+0

''는 구문 오류로 선택되어''로 변경되었습니다. 나머지 코드는 정확히 변경되었습니다. 이제 undefined가 'props.globalStateUpdate'를 평가하는 함수가 아닙니다. '오류가 발생합니다. 도와 주실 수 있겠습니까? – AZG

+0

의 screenProps를 통해 상태를 전달하면 좋습니다. 내 코드를 업데이트했습니다. 확인해주십시오. –

+0

감사합니다. – AZG