React-native-router-flux: μž₯면의 수λͺ… μ£ΌκΈ° ν›„ν¬μ—μ„œ λ™μ μœΌλ‘œ navigationBarStyle μ„€μ •

에 λ§Œλ“  2016λ…„ 08μ›” 09일  Β·  9μ½”λ©˜νŠΈ  Β·  좜처: aksonov/react-native-router-flux

λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ κ²€μƒ‰λœ 데이터λ₯Ό 기반으둜 μž₯면을 ν…Œλ§ˆλ‘œ μ§€μ •ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. λ™μΌν•œ μž₯λ©΄μ—μ„œ μ‚¬μš©μžκ°€ μ„€μ •μ—μ„œ κ΅¬μ„±ν•œ λ‚΄μš©μ— 따라 뢄홍색, 보라색, νŒŒλž€μƒ‰ λ“±μ˜ 탐색 λͺ¨μŒμ„ λ Œλ”λ§ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μž₯면이 호좜되고 μž₯면을 μƒμ„±ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” 데이터가 λ‘œλ“œλ  λ•ŒκΉŒμ§€ 탐색 λͺ¨μŒ 배경색이 μ–΄λ–»κ²Œ 될지 λͺ¨λ¦…λ‹ˆλ‹€. λͺ¨λ“  μž₯λ©΄ 논리λ₯Ό ν•˜λ‚˜λ‘œ μœ μ§€ν•˜κΈ° μœ„ν•΄ μž₯λ©΄ 자체의 수λͺ… μ£ΌκΈ° 후크에 μž‘μ„±ν•˜λŠ” 것을 μ„ ν˜Έν•©λ‹ˆλ‹€. μ—¬κΈ°μ €κΈ° 흩어져 μžˆκΈ°λ³΄λ‹€λŠ” μž₯μ†Œμ—.

<Scene key="scene-name" /> κ°€ μ •μ˜λœ λΌμš°ν„° μˆ˜μ€€μ—μ„œ 미리 μ •μ˜ν•  ν•„μš” 없이 μž₯λ©΄ μžμ²΄μ—μ„œ, 즉 데이터λ₯Ό κ°€μ Έμ˜¨ ν›„ 수λͺ… μ£ΌκΈ° 후크 λ‚΄μ—μ„œ λ™μ μœΌλ‘œ navigationBarStyle λ₯Ό μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

question

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

예, Actions.refresh()λ₯Ό 톡해 μ†Œν’ˆμ„ μ—…λ°μ΄νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예:
Actions.refresh({ renderRightButton: this._renderRightButton });
https://github.com/aksonov/react-native-router-flux/blob/master/docs/OTHER_INFO.md

λͺ¨λ“  9 λŒ“κΈ€

λ§ˆμ°¬κ°€μ§€λ‘œ, navBarμ—μ„œ 데이터에 μ˜μ‘΄ν•˜λŠ” μž‘μ—…μœΌλ‘œ μ•‘μ…˜ μ‹œνŠΈλ₯Ό λ Œλ”λ§ν•˜λŠ” 동적 였λ₯Έμͺ½ λ²„νŠΌμ„ μ‚¬μš©ν•˜λ €κ³  ν•©λ‹ˆλ‹€. μƒκ°ν•΄λ³΄μ„Έμš”... Follow userABC123 ; Block userABC123 ; λ“±. μ‚¬μš©μž 지정 μž‘μ—… μ‹œνŠΈλ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄ 수λͺ… μ£ΌκΈ° 후크(즉, 데이터λ₯Ό κ°€μ Έμ˜¨ ν›„) λ‚΄μ—μ„œ onRight ν•¨μˆ˜λ₯Ό λ™μ μœΌλ‘œ μƒμ„±ν•˜λŠ” 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

예, Actions.refresh()λ₯Ό 톡해 μ†Œν’ˆμ„ μ—…λ°μ΄νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예:
Actions.refresh({ renderRightButton: this._renderRightButton });
https://github.com/aksonov/react-native-router-flux/blob/master/docs/OTHER_INFO.md

@sheparddw κ°€ λ§žμŠ΅λ‹ˆλ‹€. 같은 λ°©λ²•μœΌλ‘œ navigationBarStyle λ₯Ό Actions.refresh({navigationBarStyle ... }) μ—…λ°μ΄νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Actions.refresh() ν˜ΈμΆœμ„ 어디에 λ„£μ–΄μ•Ό ν•©λ‹ˆκΉŒ?
λ‚΄ ν”ŒλŸ­μŠ€ μž‘μ—…μ— μƒˆλ‘œ κ³ μΉ¨ ν˜ΈμΆœμ„ λ„£μœΌλ©΄(μŠ€νƒ€μΌμ΄ λ³€κ²½λ˜μ–΄μ•Ό ν•  λ•Œ 호좜됨) ν˜„μž¬ μ„ νƒν•œ νƒ­μ˜ 탐색 λͺ¨μŒ μŠ€νƒ€μΌλ§Œ μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€. 탭을 μ „ν™˜ν•˜λ©΄ 이전 μŠ€νƒ€μΌλ‘œ λŒμ•„κ°‘λ‹ˆλ‹€.

탭을 μ „ν™˜ν•  λ•Œλ§ˆλ‹€ μ—…λ°μ΄νŠΈλ˜λŠ” μœ μΌν•œ ꡬ성 μš”μ†ŒλŠ” λ‚΄ νƒ­ λͺ¨μŒμ΄λ―€λ‘œ componentWillReceiveProps λ˜λŠ” componentWillUpdate μžˆλŠ” λ‚΄ Tabbar ꡬ성 μš”μ†Œμ˜ μƒˆλ‘œ 고침을 μ‹œλ„ν–ˆμŠ΅λ‹ˆλ‹€. 그런 λ‹€μŒ μƒˆλ‘œ κ³ μΉ  λ•Œλ§ˆλ‹€ Tabbarκ°€ μƒˆ μ†Œν’ˆμ„ κ°€μ Έμ˜€κ³  λ‹€μ‹œ μƒˆλ‘œ 고쳐지기 λ•Œλ¬Έμ— λ¬΄ν•œ μž¬κ·€κ°€ λ°œμƒν•©λ‹ˆλ‹€.

@aksonov 이것에 λŒ€ν•΄ μ–ΈκΈ‰ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?

λ‚΄ ꡬ성 μš”μ†Œμ—μ„œ Actions.refreshλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμ—ˆμ§€λ§Œ 이것이 μž₯면의 속성을 λ™μ μœΌλ‘œ μ—…λ°μ΄νŠΈν•˜λŠ” μ˜¬λ°”λ₯Έ 방법이라고 μƒκ°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ—¬κΈ° λ‚΄ 발견이 μžˆμŠ΅λ‹ˆλ‹€.

// μ°Έκ³ : Componentλ₯Ό ν™•μž₯ν•˜λŠ” es6 클래슀λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

Actions.refresh({title: 'drawer'}); μƒμ„±μžμ—μ„œ λ‹€μŒκ³Ό 같이 λΆˆν‰ν•©λ‹ˆλ‹€.

κ²½κ³ : setState(...): κΈ°μ‘΄ μƒνƒœ μ „ν™˜ μ€‘μ—λŠ” μ—…λ°μ΄νŠΈν•  수 μ—†μŠ΅λ‹ˆλ‹€(예: render λ˜λŠ” λ‹€λ₯Έ ꡬ성 μš”μ†Œμ˜ μƒμ„±μž λ‚΄μ—μ„œ). λ Œλ” λ©”μ†Œλ“œλŠ” props와 state의 μˆœμˆ˜ν•œ ν•¨μˆ˜μ—¬μ•Ό ν•©λ‹ˆλ‹€. μƒμ„±μž λΆ€μž‘μš©μ€ μ•ˆν‹° νŒ¨ν„΄μ΄μ§€λ§Œ componentWillMount 둜 이동할 수 μžˆμŠ΅λ‹ˆλ‹€.

이것은 단지 경고일 뿐이며 μ›ν•˜λŠ” κ²°κ³Όλ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λΆ€μž‘μš©μ΄ μžˆμŠ΅λ‹ˆλ‹€. 이 μž‘μ—…μ„ μˆ˜ν–‰ν•  λ•Œ render ν•¨μˆ˜κ°€ 두 번 ν˜ΈμΆœλ©λ‹ˆλ‹€.

이것을 componentWillMount ν•¨μˆ˜μ— 직접 λ°°μΉ˜ν•˜λ©΄ reactλŠ” κ²½κ³ λ₯Ό λ°œν–‰ν•˜μ§€ μ•Šμ§€λ§Œ render도 두 번 ν˜ΈμΆœλ©λ‹ˆλ‹€.

μƒμ„±μžμ—μ„œ μ΄λ ‡κ²Œ ν•˜λ©΄:
this.props.navigationState.title = 'test';

그러면 λ°˜μ‘μ΄ λΆˆν‰ν•˜μ§€ μ•Šκ³  우리의 navigationBar 제λͺ©μ΄ ν…ŒμŠ€νŠΈλ  κ²ƒμž…λ‹ˆλ‹€. render λ©”μ„œλ“œλŠ” ν•œ 번만 ν˜ΈμΆœλ©λ‹ˆλ‹€. onRight, onRightTitle 등을 ν˜ΈμΆœν•˜λŠ” κ²½μš°μ—λ„ λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€. 이제 이 https://facebook.github.io/react/docs/jsx-spread.html#mutating -props-is-bad mutating props is bad에 λ”°λ₯Έ κ²ƒμž…λ‹ˆλ‹€.

λ”°λΌμ„œ λ‚˜μœ propsλ₯Ό λ³€κ²½ν•˜κ±°λ‚˜ Actions.refreshλ₯Ό ν˜ΈμΆœν•˜μ—¬ ꡬ성 μš”μ†Œλ₯Ό 두 번 λ Œλ”λ§ν•˜λŠ” 것과 같은 λΆ€μž‘μš©μ΄ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. 아이디어가 μžˆμŠ΅λ‹ˆκΉŒ?

이에 λŒ€ν•œ μ—…λ°μ΄νŠΈκ°€ μžˆμŠ΅λ‹ˆκΉŒ? μ‚¬μš©μž μ†Œν’ˆμ— 따라 navigationBarStyle을 λ™μ μœΌλ‘œ μ„€μ •ν•˜λŠ” 것과 λ˜‘κ°™μ€ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 특히 탐색 λͺ¨μŒμ˜ 배경색을 λ³€κ²½ν•˜λ €κ³  ν•©λ‹ˆλ‹€. Actions.refresh({navigationBarStyle ... }) 도 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

<Scene key="myScene"
component={myComponent}
renderTitle={() => { return <NavigationBarTitle title="My Title"/>}}
sceneStyle={styles.scene}
navigationBarStyle={[styles.navBar, this.props.theme.backgroundColor]} <- μƒνƒœκ°€ 변경될 λ•Œ backgroundColorκ°€ μ—…λ°μ΄νŠΈλ˜μ§€ μ•ŠμŒ
onRight={this.pushNoticeFilter}/>

탐색 λͺ¨μŒμ˜ μ‚¬μš©μž 지정 제λͺ© ꡬ성 μš”μ†Œμ—μ„œ λ‹€λ₯Έ 제λͺ©κ³Ό μŠ€νƒ€μΌμ„ λ™μ μœΌλ‘œ λ Œλ”λ§ν–ˆμ§€λ§Œ navigationBarStyle은 μƒνƒœ 변경을 μˆ˜μ‹ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이것은 "Key myScene is already defined!"λ₯Ό μΈμ‡„ν•˜λŠ” μž₯면의 μž¬λ Œλ”λ§μ„ λ¬΄μ‹œν•˜λŠ” RNRF와 관련이 μžˆμŠ΅λ‹ˆκΉŒ?

@mikaelrosquist @compojoom μ„œλ²„μ—μ„œ κ°€μ Έμ˜¨ "ν…Œλ§ˆ"λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄ reduxλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 래퍼 ꡬ성 μš”μ†Œλ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ 동적 탐색 λͺ¨μŒ μŠ€νƒ€μΌμ„ μˆ˜ν–‰ν•˜λŠ” κ°€μž₯ μ‰¬μš΄ λ°©λ²•μž…λ‹ˆλ‹€.

import React, { Component } from 'react';
import { NavBar } from 'react-native-router-flux';
import Variables from 'market/app/styles/base';

class CircllyNavBar extends Component {
  render() {
    return (
      <NavBar {...this.props} navigationBarStyle={{ backgroundColor: Variables.BRAND_PRIMARY() }} />
    )
  }
}

export default CircllyNavBar;
<Scene key="search_form" title="Search"
    component={SearchForm}
    navBar={CircllyNavBar} />

@OhaiBBQ κ°μ‚¬ν•©λ‹ˆλ‹€! μ™„λ²½ν•˜κ²Œ μž‘λ™ν•©λ‹ˆλ‹€! πŸ‘

@mikaelrosquist 문제 μ—†μŠ΅λ‹ˆλ‹€. λ‚΄κ°€ Reactλ₯Ό 처음 μ ‘ν–ˆμ„ λ•Œ ν₯미둭게 λ°œκ²¬ν•œ 또 λ‹€λ₯Έ 점은 React ꡬ성 μš”μ†Œμ˜ defaultProps 클래슀 속성을 μ‚¬μš©ν•˜μ—¬ RNRF μž₯면의 κΈ°λ³Έ μ†Œν’ˆμ„ μ„€μ •ν•  수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

class Scene extends RNRFScene { }

Scene.defaultProps = {
  navBar: CircllyNavBar
};
이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰