React Native : 다른 구성 요소에서 상태 변경

빈스 카터

저는 React-Native를 처음 사용합니다. 내 서비스에서 json 형식으로 정보를 얻고 그 후 데이터를 표시하는 화면이 있습니다. 이 화면에는 사용자가 다른 날짜를 선택할 수있는 "Calendar"구성 요소가 있습니다. 해당 구성 요소에서 예측 상태를 업데이트하는 방법을 모르겠습니다.

내 홈 화면은 다음과 같습니다.

export default function HomeScreen({ navigation }) {

  const [predictions, setPredictions] = useState([]);
  const [params, setParams] = useState({
    lang: 'en',
    date: '2020-10-11',
    sport: 'soccer'
  });

  useEffect( () => {
    loadPredictions();
  }, []);

  const loadPredictions = async () => {
    const response = await PredictionsApi.getPredictions({params});
    // console.log(response.data);
    setPredictions(response.data);
  }

  return (
    <View style={styles.main}>
        <View style={styles.container}>
          <Calendar />
          ...
        </View>
    </View>
}

내 캘린더 구성 요소는 다음과 같습니다.

function renderDates({props}) {
    const dates = [];
    for(let i=-2;i<4;++i) {
        var currentDate = new Date(new Date().getTime() + 24 * 60 * 60 * i * 1000);
        dates.push(
            <TouchableOpacity style={styles.dates} onPress={()=> props.setPredictions({
                lang: 'en',
                date: '2020-02-01',
                sport: 'tennis',
            })
            }>
                <Text style={styles.selected}>{Moment(currentDate).format('ddd')}{"\n"}{Moment(currentDate).format('DD')}</Text>
            </TouchableOpacity>
        );
    }
    return dates;
}

export default function Calendar({props}) {
    return (
        <View style={styles.calendarContainer}>
            ...
            <View style={styles.second}>
                {renderDates({props})}
            </View>
        </View>
    );
}
제임스

따라서이 코드에서 다르게 수행 할 것을 권장하는 몇 가지 사항이 있습니다. 그러나 질문에 답하기 위해 setPredictions함수를 prop으로 전달한 다음 컴포넌트 props.setPredictions()에서 호출 할 Calendar있습니다.

이 아이디어의 간단한 예는 다음과 같습니다.

const Parent = () => {
  const parentFunction = () => console.log('Hello from parent');

  return <Child parentFunction={parentFunction} />;
};


// clicking the div in this child will call the function defined in Parent
const Child = ({parentFunction}) => <div onClick={parentFunction}>Click me</div>;

부모에서 상태를 설정하는 모든 함수에 대해 동일한 원칙을 사용할 수 있습니다.

여기서 멈추겠습니다. 이것이 귀하의 코드에 어떻게 적용되는지에 대한 질문이 있으면 문의하십시오. 나머지 코드에 대한 추가 조언이 필요하면 알려주세요. 감사.

귀하의 코드에 대한 몇 가지 우려 사항을 해결하려는 시도입니다. 귀하의 문제는 소품의 잘못된 구조화로 인해 발생했으며 실제로 하위 구성 요소의 어느 곳에서나 예측을 설정하거나 API를 호출하지 않은 것 같습니다. 나는 이것이 의미가 있기를 바랍니다.

// use const instead of function - more conventional
const HomeScreen = ({navigation}) => {
  const [predictions, setPredictions] = useState([]);
  const [params, setParams] = useState({
    lang: 'en',
    date: '2020-10-11',
    sport: 'soccer',
  });

  useEffect(() => {
    loadPredictions();
  }, []);

  const loadPredictions = async () => {
    const response = await PredictionsApi.getPredictions({params});
    // console.log(response.data);
    setPredictions(response.data);
  };

  return (
    <View style={styles.main}>
      <View style={styles.container}>
        {/* Pass load predictions and setParams to Calendar as props */}
        <Calendar loadPredictions={loadPredictions} setParams={setParams} />
      </View>
    </View>
  );
};

// destructuring should be used to get the individual props. If you put {props} then
// the implication is you would be using `props.props.theActualProp`
// so either remove the curly braces or destructure the actual props
// you want to use
const Calendar = props => (
  <View style={styles.calendarContainer}>
    <View style={styles.second}>
      {/* pass all the props down to Dates component */}
      {/* I also changed this to an element, since there is no reason to do otherwise */}
      <Dates {...props} />
      {/* I added a button here so you can actually reload the predictions */}
      <TouchableOpacity onPress={props.loadPredictions}>Load new predictions</TouchableOpacity>
    </View>
  </View>
);

// only destructure if you are pulling individual props OUT of the `props` object
const Dates = props => {
  // don't use for loops inside a function like this... it's cleaner to use the `map` method
  // on an array

  // cache the current time once per render if you need to
  const cachedTime = new Date().getTime();

  // I'm not sure why these particular numbers are important, or what you're trying to do here
  // I've preserverd the behaviour from your for loop, but depending on what you're trying
  // to achieve there is probably a more sensible solution to this
  return [-2, -1, 0, 1, 2, 3, 4].map(val => {
    const rowDate = new Date(cachedTime + 24 * 60 * 60 * val * 1000);

    return (
      <TouchableOpacity
        // add a key when mapping over an array
        key={val}
        style={styles.dates}
        onPress={() =>
          // I changed this to setParams. I think this is what you meant, since
          // setPredictions should only be form your API response?
          props.setParams({
            lang: 'en',
            date: '2020-02-01',
            sport: 'tennis',
          })
        }
      >
        <Text style={styles.selected}>
          {Moment(rowDate).format('ddd')}
          {'\n'}
          {Moment(rowDate).format('DD')}
        </Text>
      </TouchableOpacity>
    );
  });
};

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

React Native에서 한 함수 구성 요소의 상태를 다른 함수 구성 요소에서 변경하는 방법은 무엇입니까?

분류에서Dev

React Native-상태를 다른 구성 요소로 전달

분류에서Dev

다른 구성 요소의 상태에 따라 React 구성 요소 가시성 변경

분류에서Dev

React Native에서 상태 변경 후에도 구성 요소의 오버레이가 사라지지 않습니다.

분류에서Dev

상태 변경시 React Native 구성 요소가 다시 렌더링되지 않는 이유

분류에서Dev

React Native : <TextInput> 구성 요소 내에서 텍스트 색상을 변경할 수 없습니다.

분류에서Dev

상태의 다른 부분에 연결된 다른 경로에서 react / redux 구성 요소 재사용

분류에서Dev

다른 파일의 다른 구성 요소에서 한 구성 요소의 상태 변경

분류에서Dev

다른 구성 요소에서 구성 요소 상태를 변경하는 방법은 무엇입니까?

분류에서Dev

다른 구성 요소에서 반응 구성 요소의 상태를 어떻게 변경합니까?

분류에서Dev

React Native, 한 구성 요소에서 다른 구성 요소로 소품 탐색

분류에서Dev

동적으로 생성 된 하위 구성 요소에서 상태 변경-React

분류에서Dev

React의 자식 구성 요소에서 부모 상태 변경 (Redux 없음)

분류에서Dev

react native : 상태 변경시 하위 구성 요소 다시 렌더링을 중지하는 방법은 무엇입니까?

분류에서Dev

React Native : 상태 변경시 업데이트되지 않는 Array.map () 기반 렌더링 구성 요소

분류에서Dev

React Native에서 날짜를 클래스 구성 요소의 상태로 유지

분류에서Dev

상태 변경 후 자식 구성 요소에서 다시 렌더링

분류에서Dev

자식에서 부모 상태 변경 (둘 다 기능 구성 요소 임)

분류에서Dev

React-Native는 항상 구성 요소에서 SwitchNavigator를 호출합니다.

분류에서Dev

반응에서 다른 구성 요소의 자식 상태가 변경되면 이벤트 트리거

분류에서Dev

컨텍스트 소비자 내에서 상태가 변경되면 React가 모든 구성 요소를 다시 렌더링합니까?

분류에서Dev

경고 : 마운트 해제 된 구성 요소에서는 React 상태 업데이트를 수행 할 수 없습니다. 기능적 구성 요소

분류에서Dev

다른 구성 요소에서 한 구성 요소의 상태를 사용하는 방법? 독립 구성 요소 (React)

분류에서Dev

React Native는 한 구성 요소를 다른 구성 요소에 삽입

분류에서Dev

React Native에서 Class 구성 요소를 기능 구성 요소로 변경하는 방법

분류에서Dev

부모의 상태가 변경 될 때 React에서 자식 구성 요소를 업데이트 (다시 렌더링)하는 방법은 무엇입니까?

분류에서Dev

React-redux 구성 요소가 상태 변경 후 다시 렌더링되지 않습니다.

분류에서Dev

setState ()를 사용해도 상태 변경 후 React 구성 요소가 다시 렌더링되지 않습니다.

분류에서Dev

부모 구성 요소 상태가 변경되면 React 경로 구성 요소가 다시 렌더링됩니다.

Related 관련 기사

  1. 1

    React Native에서 한 함수 구성 요소의 상태를 다른 함수 구성 요소에서 변경하는 방법은 무엇입니까?

  2. 2

    React Native-상태를 다른 구성 요소로 전달

  3. 3

    다른 구성 요소의 상태에 따라 React 구성 요소 가시성 변경

  4. 4

    React Native에서 상태 변경 후에도 구성 요소의 오버레이가 사라지지 않습니다.

  5. 5

    상태 변경시 React Native 구성 요소가 다시 렌더링되지 않는 이유

  6. 6

    React Native : <TextInput> 구성 요소 내에서 텍스트 색상을 변경할 수 없습니다.

  7. 7

    상태의 다른 부분에 연결된 다른 경로에서 react / redux 구성 요소 재사용

  8. 8

    다른 파일의 다른 구성 요소에서 한 구성 요소의 상태 변경

  9. 9

    다른 구성 요소에서 구성 요소 상태를 변경하는 방법은 무엇입니까?

  10. 10

    다른 구성 요소에서 반응 구성 요소의 상태를 어떻게 변경합니까?

  11. 11

    React Native, 한 구성 요소에서 다른 구성 요소로 소품 탐색

  12. 12

    동적으로 생성 된 하위 구성 요소에서 상태 변경-React

  13. 13

    React의 자식 구성 요소에서 부모 상태 변경 (Redux 없음)

  14. 14

    react native : 상태 변경시 하위 구성 요소 다시 렌더링을 중지하는 방법은 무엇입니까?

  15. 15

    React Native : 상태 변경시 업데이트되지 않는 Array.map () 기반 렌더링 구성 요소

  16. 16

    React Native에서 날짜를 클래스 구성 요소의 상태로 유지

  17. 17

    상태 변경 후 자식 구성 요소에서 다시 렌더링

  18. 18

    자식에서 부모 상태 변경 (둘 다 기능 구성 요소 임)

  19. 19

    React-Native는 항상 구성 요소에서 SwitchNavigator를 호출합니다.

  20. 20

    반응에서 다른 구성 요소의 자식 상태가 변경되면 이벤트 트리거

  21. 21

    컨텍스트 소비자 내에서 상태가 변경되면 React가 모든 구성 요소를 다시 렌더링합니까?

  22. 22

    경고 : 마운트 해제 된 구성 요소에서는 React 상태 업데이트를 수행 할 수 없습니다. 기능적 구성 요소

  23. 23

    다른 구성 요소에서 한 구성 요소의 상태를 사용하는 방법? 독립 구성 요소 (React)

  24. 24

    React Native는 한 구성 요소를 다른 구성 요소에 삽입

  25. 25

    React Native에서 Class 구성 요소를 기능 구성 요소로 변경하는 방법

  26. 26

    부모의 상태가 변경 될 때 React에서 자식 구성 요소를 업데이트 (다시 렌더링)하는 방법은 무엇입니까?

  27. 27

    React-redux 구성 요소가 상태 변경 후 다시 렌더링되지 않습니다.

  28. 28

    setState ()를 사용해도 상태 변경 후 React 구성 요소가 다시 렌더링되지 않습니다.

  29. 29

    부모 구성 요소 상태가 변경되면 React 경로 구성 요소가 다시 렌더링됩니다.

뜨겁다태그

보관