React-native-router-flux: ๋™์  ์ œ๋ชฉ

์— ๋งŒ๋“  2016๋…„ 02์›” 19์ผ  ยท  23์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: aksonov/react-native-router-flux

์•ˆ๋…•ํ•˜์„ธ์š”,
ํ›Œ๋ฅญํ•œ ๋ชจ๋“ˆ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค - ์ œ๋ชฉ๊ณผ ํƒ์ƒ‰ ํ‘œ์‹œ์ค„์˜ ์ƒํƒœ๋ฅผ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ๋ฅผ ๋“ค์–ด.
<Route key="UserCredentials" name="UserCredentials" hideNavBar={this.state.UserCredentialsNavBar} component={UserCredentials} initial={ false } title={this.state.title} schema="withoutAnimation" />

๊ทธ๋Ÿฐ ๋‹ค์Œ this.state.UserCredentialsNavBar 'true' ๋˜๋Š” 'false' ๋ฐ this.state.title 'Some title' ๋˜๋Š” 'Some other title' ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์‹œ๋„ํ–ˆ์ง€๋งŒ ์•„๋ฌด๋ฐ๋„ ์–ป์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
:0)

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค aksonov.
๋‚ด๊ฐ€ ๋‹น์‹ ์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์ œ๋ชฉ์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ „ํ™” ํ•  ๊ฒƒ์ด๋‹ค
Actions.refresh({title: 'Some other title'})
๋‹ค์‹œ ์ฐพ์•„์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
:0)

๋ชจ๋“  23 ๋Œ“๊ธ€

Actions.refresh(props)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด๋น„๊ฒŒ์ดํ„ฐ ์ „ํ™˜ ์—†์ด ์†์„ฑ์„ ์„ค์ •ํ•˜๋Š” ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹œ๋„ํ•ด ๋ณด์„ธ์š”(๋ฒ„์ „ 2.3.1).

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค aksonov.
๋‚ด๊ฐ€ ๋‹น์‹ ์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์ œ๋ชฉ์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ „ํ™” ํ•  ๊ฒƒ์ด๋‹ค
Actions.refresh({title: 'Some other title'})
๋‹ค์‹œ ์ฐพ์•„์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
:0)

๋‚ด ๋‚˜์œ, ๋ชจ๋‘ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋„์›€์„ ์ฃผ์…”์„œ ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค aksonov. ๋งค์šฐ ๊ฐ์‚ฌ. :0)

์ œ๋ชฉ์„ ๋™์ ์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๋ฒ„๊ทธ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. Actions.refresh๊ฐ€ ์ •์  ์ œ๋ชฉ์„ ์žฌ์ •์˜ํ•˜์—ฌ ๋ชจ๋“  ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ์„ค์ •ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” ๋งˆ์Šคํ„ฐ ๊ฒฝ๋กœ์— ์ œ๋ชฉ ์†Œํ’ˆ์ด ์žˆ๊ณ  ์„ธ๋ถ€ ๊ฒฝ๋กœ ์ œ๋ชฉ์ด ๋™์ ์œผ๋กœ๋งŒ ์„ค์ •๋˜๋Š” ๋งˆ์Šคํ„ฐ-์„ธ๋ถ€ ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์„ธ๋ถ€ ๊ฒฝ๋กœ์— ์žˆ๊ณ  ์ œ๋ชฉ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ œ๋ชฉ๊ณผ ๋’ค๋กœ ๋ฒ„ํŠผ์ด ๋ชจ๋‘ ๋™์ผํ•œ ํ…์ŠคํŠธ๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์Šคํ„ฐ๋กœ ๋Œ์•„๊ฐˆ ๋•Œ ๋™์  ์ œ๋ชฉ์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค(์Šคํ‚ค๋งˆ ์ œ๋ชฉ์œผ๋กœ ๋Œ์•„๊ฐ€์ง€ ์•Š๊ณ ).

๋‚˜๋Š” React Native๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ์˜๋„ ๋œ ๊ฒƒ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ...?

๊ฐ์‚ฌ ํ•ด์š”!

๋‚ด๊ฐ€ ํ˜„์žฌ ๊ทธ ์žฅ๋ฉด์— ์žˆ์ง€ ์•Š์•„๋„ ํŠน์ • ์žฅ๋ฉด์— ๋Œ€ํ•ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‚˜์š”? ์ฆ‰

Actions.refresh({key: 'home', title: 'My new title'})

@greatwitenorth ์ •ํ™•ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
์˜ˆ๋ฅผ ๋“ค์–ด view2 ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ทฐ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์†Œํ’ˆ์œผ๋กœ ์ œ๋ชฉ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Actions.view2({ title: 'My New Title' })

๋‚ด ๋ฌธ์ œ๋Š” ์ œ๋ชฉ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•œ ์žฅ๋ฉด์œผ๋กœ ์ด๋™ํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ํ™”๋ฉด์€ ์‚ฌ์šฉ์ž์˜ ์ฃผ์†Œ๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ์ง€๋งŒ ์ฃผ์†Œ๋Š” ์™„์ „ํžˆ ๋ณ„๋„์˜ ํ™”๋ฉด์— ์ œ๋ชฉ์œผ๋กœ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@greatwitenorth ๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ์—

์ข‹์•„, ๋‚˜๋Š” ๋ฌธ์„œ๋ฅผ ๋” ์ž˜ ์ฝ์—ˆ์–ด์•ผ ํ–ˆ๋‹ค, ๊ทธ๊ฒƒ์€ ๋‹จ์ˆœํžˆ
Actions.refresh({title: 'new title'})

@greatwitenorth ๊ดœ์ฐฎ์€ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ?
์ƒํƒœ์—์„œ ์ œ๋ชฉ์„ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํŠน์ • ๋ณด๊ธฐ๊ฐ€ ํ•ด๋‹น ๊ฐ’์„ ์ œ๋ชฉ์œผ๋กœ ๊ฐ€์ง€๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ ์‚ฌ๋žŒ๋“ค์€ ์ œ๋ชฉ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ๋’ค๋กœ ๋ฒ„ํŠผ์„ ํ†ตํ•ด ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ {title: } ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(๋’ค๋กœ ์ž‘์—…์—์„œ ์ƒํƒœ ๊ฐ’ ์ „๋‹ฌ), ์•„๋‹ˆ๋ฉด ์ œ๊ฐ€ ๋†“์นœ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ตฌ์„ฑ ์š”์†Œ(๋˜๋Š” ๋ Œ๋”๋ง)์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ƒˆ๋กœ ๊ณ ์น˜๋ฉด ์ƒํƒœ ์†์„ฑ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์•ฑ์ด ๋ฌดํ•œ ๋ฃจํ”„์— ๋น ์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์•ฑ์ด ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋ถ€ ์ธ์‚ฌ,

@JeroenNelen ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ  ComponentDidMount์— ์ƒˆ๋กœ ๊ณ ์นจ์„ ๋„ฃ๊ณ  Redux ๋ฆฌ๋“€์„œ์—์„œ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ๋ชฉ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์•ฑ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  props๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฅผ ์ฝ๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ž‘์—…์— Redux ์ž‘์—…์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๋„.

๊ธฐ๋ณธ์ ์œผ๋กœ ComponentDidMount์˜ ๋‹ค์Œ ์ค„๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Actions.refresh({title: this.props.state.myapp.myvalue})

@jondbm ์ œ์•ˆ์— ๊ฐ์‚ฌํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ํƒ์ƒ‰๊ธฐ๋กœ ์ „ํ™˜ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋ถ€ ์ธ์‚ฌ,

@JeroenNelen ์ง€๊ธˆ ์–ด๋–ค ๋„ค๋น„๊ฒŒ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? (๊ณต์œ ๊ฐ€ ์‹ซ๋‹ค๋ฉด)

์•„๋ž˜ ์„ค์ •์—์„œ ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ์„ ์ƒˆ๋กœ ๊ณ ์นจํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? console.log๊ฐ€ ์ƒˆ ๊ฐ’์„ ๊ธฐ๋กํ•˜์ง€๋งŒ ์˜ฌ๋ฐ”๋ฅธ ์ œ๋ชฉ์ด ์ƒˆ๋กœ ๊ณ ์ณ์ง€์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

const RouterWithRedux = connect()(Router);

export class App extends Component {

  constructor(props) {
    super(props);
  }

  render() {
    let title = '(' + this.props.basket.length + ')';
    console.log(title);
    return (
      <RouterWithRedux rightTitle={title} onRight={() => alert('All right')}>
        <Scene key="root">
          <Scene key="home" component={Main} title="Main"/>
          <Scene key="page1" component={SomePage} title="SomePage"/>
        </Scene>
      </RouterWithRedux>
    );
  }
}
App.propTypes = {
  dispatch: PropTypes.func.isRequired
};

// Wrap the component to inject dispatch and state into it
export default connect(
  state => {
    return {basket: state.basket.items}
  }
)(App);

@jaynakus righttitle ๋˜๋Š” ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ?

์ œ๋ชฉ!

์›ํ•˜๋Š” ๋Œ€๋กœ ์‚ฌ์šฉ์ž ์ง€์ • ํƒ์ƒ‰ ๋ชจ์Œ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@jaynakus๋Š” rightTitle ๋ฐ onRight๋ฅผ ์ตœ์ƒ์œ„ RouterWithRedux ์ˆ˜์ค€ ๋Œ€์‹  Scene ๊ตฌ์„ฑ ์š”์†Œ์—

@jondbm ์„ ๋ฃจํŠธ ์žฅ๋ฉด์— ๋„ฃ๋Š” ๊ฒƒ์€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์ง€๋งŒ

const RouterWithRedux = connect()(Router);

export class App extends Component {

  constructor(props) {
    super(props);
  }

  componentWillReceiveProps(nextProps) {
    if (this.props.basket.length !== nextProps.basket.length) {
      console.log(nextProps.basket.length);
      let title = '(' + nextProps.basket.length + ')';
      Actions.refresh({rightTitle: title});
    }
  }

  render() {
    let title = '(' + this.props.basket.length + ')';
    return (
      <RouterWithRedux>
        <Scene key="root" rightTitle={title} onRight={() => alert('All right')}>
          <Scene key="home" component={Main} title="Main"/>
          <Scene key="page1" component={SomePage} title="SomePage"/>
        </Scene>
      </RouterWithRedux>
    );
  }
}
App.propTypes = {
  dispatch: PropTypes.func.isRequired
};

// Wrap the component to inject dispatch and state into it
export default connect(
  state => {
    return {basket: state.basket.items}
  }
)(App);

์—ฌ๊ธฐ๋ฅผ ๋ณด์‹ญ์‹œ์˜ค: https://github.com/aksonov/react-native-router-flux/issues/1922

๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค. ์ „ํ™˜ํ•  ๋•Œ ์ œ๋ชฉ์„ ํŽ˜์ด๋“œ ์ธ/์•„์›ƒํ•˜๋Š” ๊น”๋”ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ œ ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์šฉ์ž๊ฐ€ 100px ์ด์ƒ ์Šคํฌ๋กคํ•˜๋ฉด ์ œ๋ชฉ์ด ๋ฐ”๋€๋‹ˆ๋‹ค. ์ „ํ™˜์„ ํŽ˜์ด๋“œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฑด๋ฐฐ.

@greatwitenorth ์ •ํ™•ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
์˜ˆ๋ฅผ ๋“ค์–ด view2 ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ทฐ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์†Œํ’ˆ์œผ๋กœ ์ œ๋ชฉ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

```js
Actions.view2({ title: '๋‚ด ์ƒˆ ์ œ๋ชฉ' })

์„ค์ • ํŒŒ์ผ์—์„œ ์–ด๋–ป๊ฒŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ:

<Router>
                    <Scene key="root" navBar={NavBar}>
                        <Scene
                            hideNavBar
                            key="login"
                            component={Login}
                            initial
                        />

                        <Scene drawer
                               drawerPosition="right" drawerWidth={300}
                               key="task"
                               contentComponent={DrawerView}
                               drawerIcon={drawerIcon}
                               rightButtonImage="menu"
                               onRight={() => {
                                   Actions.drawerOpen()
                               }} hideNavBar
                        >

                            <Scene key="taskInner"
                                   leftButtonImage="arrow-back"
                                   component={TaskView}
                                   onLeft={() => {
                                       Actions.popTo('tasksList')
                                   }}
                            />
                        </Scene>

                    </Scene>
</Router>

๊ทธ๋Ÿฌ๋ฉด Actions.task({ title: 'My New Title' }) ๋˜๋Š” Actions.refresh({title: "My New Title"})๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋ž์ด ์žˆ์„ ๋•Œ ์ œ๋ชฉ์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์ผ๋ถ€ ์†์„ฑ์„ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰