Dva: ๋ฐ˜์‘ ๋ผ์ดํ”„ ์‚ฌ์ดํด ์ด๋ฒคํŠธ๊ฐ€ ์–ด๋””์— ๊ธฐ๋ก๋˜๋Š”์ง€ ๋ฌผ์–ด๋ณด์‹ญ์‹œ์˜ค.

์— ๋งŒ๋“  2017๋…„ 01์›” 16์ผ  ยท  15์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: dvajs/dva

  1. componentWillMount
  2. componentDidMount

๋ฐฉ๊ธˆ dva์— ์—ฐ๋ฝํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋Š”๋ฐ dva์—์„œ ํ•˜๋˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด ์ด๋ฒคํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ง ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ ์ปดํฌ๋„ŒํŠธ์˜ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋Šฅ์ด React.Component๋ฅผ ํ™•์žฅํ•˜๋„๋ก ๋ณ€๊ฒฝ๋˜๋ฉด ์–ด๋–ค ์˜ํ–ฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

question

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

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

์ปดํฌ๋„ŒํŠธ์˜ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋Šฅ์ด React.Component๋ฅผ ํ™•์žฅํ•˜๋„๋ก ๋ณ€๊ฒฝ๋˜๋ฉด ์–ด๋–ค ์˜ํ–ฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

ํšจ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์ด์ „ ์Šต๊ด€์— ๋”ฐ๋ผ ์ž‘์„ฑํ•œ ๋‹ค์Œ ๋ฐ์ดํ„ฐ ๊ณ„์ธต์— dva๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฐ์ดํ„ฐ ๋ ˆ์ด์–ด์— dva๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”??? โ€‹โ€‹๊ฐ€์ž… ๋ฐฉ๋ฒ•์€?
์–ด์ ฏ๋ฐค์— dva+andMobile์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ƒˆ์Šต๋‹ˆ๋‹ค.

https://github.com/sorrycc/blog/issues/18 ์ด ํŠœํ† ๋ฆฌ์–ผ์„ ๋”ฐ๋ผ ์ง„ํ–‰ํ•˜๊ณ  ์ดํ•ดํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜์‹ญ์‹œ์˜ค.

์•ˆ๊ฐ€์„œ ๋‹ค์‹œ ์ฝ๊ณ  ์ •๋ณด๋„ ์ข€ ์ฐพ์•„๋ดค๋Š”๋ฐ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” redux์— ๋Œ€ํ•œ ์ดํ•ด์ž…๋‹ˆ๋‹ค.
componentWillMount() ๋ฐ componentDidMount()์˜ ์“ฐ๊ธฐ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํŠน์ • ํฌ์ธํ„ฐ๋ฅผ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

componentWillMount()๊ฐ€ ๋ผ์šฐํŒ…์˜ ํ›„ํฌ์— ๊ธฐ๋ก๋ฉ๋‹ˆ๊นŒ?
componentDidMount()๊ฐ€ ์™ธ๋ถ€ ๊ตฌ์„ฑ ์š”์†Œ์— ๊ธฐ๋กํ•ฉ๋‹ˆ๊นŒ?

๊ฐ™์€ ์งˆ๋ฌธ

@xttianma @CodeSuPrMan ์ด ์ƒํƒœ ๋น„์ €์žฅ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ React.Component๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.
https://facebook.github.io/react/docs/components-and-props.html ์ฐธ์กฐ

๋‹น์‹ ์€ ์žฌ๊ตฌ์„ฑ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

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

๋‹‰ ์ •

๋ชจ๋ฐ”์ผ: +86118918960666(์ค‘๊ตญ)
์œ„์ฑ—:nick_zheng88
์ด๋ฉ”์ผ: [email protected]

2017๋…„ 1์›” 18์ผ ์˜คํ›„ 4์‹œ 16๋ถ„์— CodeSuPrMan [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์›๋ž˜ ์ƒํƒœ ๋น„์ €์žฅ ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค.
const LeftNavBefore=({menus,dispatch})=>{ const{ ๋ชจ๋“œ,ItemTree
}=props.menus; const constItemTree=ItemTree; const
NavMenu=LoadMenuTree(ItemTree,ItemTree); ํ•จ์ˆ˜ ๋ณ€๊ฒฝ ๋ชจ๋“œ(๊ฐ’){
๋””์ŠคํŒจ์น˜({ ์œ ํ˜•:'๋ฉ”๋‰ด/๋ณ€๊ฒฝ ๋ชจ๋“œ', ํŽ˜์ด๋กœ๋“œ:{ ๋ชจ๋“œ:๊ฐ’?'์ˆ˜์ง':'์ธ๋ผ์ธ',
์•„์ดํ…œ ํŠธ๋ฆฌ: ์•„์ดํ…œ ํŠธ๋ฆฌ} }) ....}
๋ผ์ดํ”„ ์‚ฌ์ดํด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•˜์ด ๋ ˆ๋ฒจ ์ปดํฌ๋„ŒํŠธ ํ˜•ํƒœ๋กœ ํŒจํ‚ค์ง•ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ),
์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋“  ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์—ฌ์ „ํžˆ ์ƒํƒœ ๋น„์ €์žฅ์ด๋ฉฐ ์ˆ˜๋ช… ์ฃผ๊ธฐ์˜ ๊ท ์ผํ•œ ํŒจํ‚ค์ง•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
ํ•จ์ˆ˜ wapperComponentsStatus({ref}) {Return CompposedComponent=>{
๋ฐ˜ํ™˜ ํด๋ž˜์Šค wapper๋Š” React.Component {componentWillMount(){๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.
... (๋‚˜์ค‘์— ์ถ”์ถœ๋จ)} componentDidMount(){ ... (๋‚˜์ค‘์— ์ถ”์ถœ๋จ)} render(){ ๋ฐ˜ํ™˜
}}}}

`let LeftNav=ref=>wapperComponentsStatus({ref:ref})(LeftNavbefore);
์—ฌ๊ธฐ์— ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด ์ƒํƒœ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ๋””์ŠคํŒจ์น˜ํ•  ๋ชจ๋ธ๊ณผ ์—ฐ๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ํ•จ์ˆ˜ mapStateToProps({๋ฉ”๋‰ด}){
๋ฐ˜ํ™˜ {๋ฉ”๋‰ด};
}

๋‚ด๋ณด๋‚ด๊ธฐ ๊ธฐ๋ณธ ์—ฐ๊ฒฐ(mapStateToProps)(LeftNav);`

ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ณด๊ณ ๋ฉ๋‹ˆ๋‹ค. react์™€ redux์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๋„ˆ๋ฌด ๊นŠ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ œ ์ƒ๊ฐ์„ ๋”ฐ๋ผ๊ฐ€๋„ ๋ ๊นŒ์š”?
wrapperComponentsStatus์˜ props๋ฅผ LeftNavBefore ๊ตฌ์„ฑ ์š”์†Œ์— ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•(์ฃผ๋กœ ์ƒํƒœ ๊ธฐ๋Šฅ์„ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด) ๋ฐ redux
์—ฐ๊ฒฐ ํ›„ ์ œ๊ณต๋œ ์ƒํƒœ ๋ฐ ๋””์ŠคํŒจ์น˜๋„ LeftNavBefore ๊ตฌ์„ฑ ์š”์†Œ์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/dvajs/dva/issues/506#issuecomment-273411035 ๋˜๋Š” ์Œ์†Œ๊ฑฐ
์Šค๋ ˆ๋“œ
https://github.com/notifications/unsubscribe-auth/AAbhwGIy_VXKLgjZAouvWgWg0i3aF6cGks5rTcpmgaJpZM4LkSJ0
.

recompose๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์— ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ๊ฐ์‹ธ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ ํ˜•์‹์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํŽธ์ง‘์—์„œ ์›๋ž˜ ์ƒํƒœ ๋น„์ €์žฅ ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค.

const LeftNavbefore=({menus,dispatch})=>{
  const s=props;
  const{
    mode,ItemTree
  }=props.menus;
  const constItemTree=ItemTree;
  const NavMenu=LoadMenuTree(ItemTree,ItemTree);
  function changeMode(value){
    dispatch({
      type:'menus/changeMode',
      payload:{
        mode:value?'vertical':'inline',
        ItemTree:ItemTree
      }
    })
  }
  return(...)

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

function wapperComponentsStatus({ref}) {
return ComposedComponent=>{
  return class wapper extends React.Component {
    componentWillMount(){
        ...๏ผˆไน‹ๅŽๆๅ–ๅ‡บๆฅ๏ผ‰
    }
    componentDidMount(){
        ...๏ผˆไน‹ๅŽๆๅ–ๅ‡บๆฅ๏ผ‰
    }
    render(){
      return <ComposedComponent {...this.props} />
    }
  }
}
  }
  let LeftNav=ref=>wapperComponentsStatus({ref:ref})(LeftNavbefore);

  function mapStateToProps({menus}){
    return {menus};
  }

  export default connect(mapStateToProps)(LeftNav);

๊ทธ๋Ÿฌ๋‚˜ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ณด๊ณ ๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜์‘ ๋ฐ redux์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๋„ˆ๋ฌด ๊นŠ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์„ ๋”ฐ๋ฅด๋Š”์ง€, wrapperComponentsStatus์˜ props๋ฅผ LeftNavBefore ๊ตฌ์„ฑ ์š”์†Œ์— ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•(์ฃผ๋กœ ์ƒํƒœ ๊ธฐ๋Šฅ์„ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด) ๋ฐ redux ์—ฐ๊ฒฐ ์ƒํƒœ ๋ฐ ๋””์ŠคํŒจ์น˜๋„ LeftNavBefore ๊ตฌ์„ฑ ์š”์†Œ์— ์ „๋‹ฌ๋œ ํ›„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ์Šค์Šค๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

@nickzheng ๊ณ ๋งˆ์›Œ, ๋ณด์ž

๋‚˜๋Š” ์˜์–ด๋ฅผ ๋ชปํ•ด ์„ฑ์ˆ™ํ•œ ๊ณ„ํš์„ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ๋ฐ–์— ์—†๋‹ค ํ˜„์žฌ ๋ฐฉ๋ฒ•์€

๋ผ์šฐํ„ฐ์˜ ์—ญํ• ์€ ๋ชจ๋ธ๊ณผ ๋ทฐ๋ฅผ ์—ฐ๊ฒฐํ•œ ๋‹ค์Œ React.Component๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ ์ค‘ ํ™•์žฅ ๋ฐ ํ์‡„๋œ this.props๋Š” ์ž„์‹œ์ ์ด๋ฉฐ ๊ฑฐ๊ธฐ์— ๋ฌด์—‡์ด ์žˆ๋Š”์ง€ ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉด ์ง์ ‘ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.

import React from 'react';
import { connect } from 'dva';
import { routerRedux } from 'dva/router';
import styles from './Page.css';
import { TabBar, Icon } from "antd-mobile";
import MyTabbar from './components/MyTabbar'

class Home extends React.Component {    
    render() {
        const {menu,selectedTab,dispatch}= this.props;
        const MyTabbarProps={ menu, selectedTab, dispatch }

        return (
            <div className="home">
                {this.props.children} 
                <MyTabbar {...MyTabbarProps} /> 
            </div>
        );
    }    
}

Home.propTypes = { 
    menu:React.PropTypes.array,
    selectedTab:React.PropTypes.number,
};

function mapStateToProps({home}) { return home }

export default connect(mapStateToProps)(Home);

์žฌ๊ตฌ์„ฑ์„ ์ฝ์—ˆ์ง€๋งŒ ๊ฒฐ๊ตญ ๋‚ด๊ฐ€ ์ง์ ‘ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

import React, { Component,PropTypes } from 'react';

  function wapperComponentsLifecycle({DidMount}) {
    return ComposedComponent=>{
      return class Wapper extends React.Component {
        componentWillMount(){

        }
        componentDidMount(){
          DidMount({props:this.props});
        }
        ...่ฟ˜ๅฏไปฅๆทปๅŠ ๅˆซ็š„็”Ÿๅ‘ฝๅ‘จๆœŸๅ‡ฝๆ•ฐ
        render(){
          return <ComposedComponent {...this.props} />
        }
      }
    }
  }


export default  wapperComponentsLifecycle;

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

  function DidMount({props}) {

    const{ dispatch}=props;
    dispatch({
      type:'menus/query',
    })
  }

  let LeftNav=wapperComponentsLifecycle({DidMount})(LeftNavbefore);

dva ๋ฌธ์„œ๋ฅผ ๋‹ค์‹œ ๋ณด๋ฉด ์ด ๋‹จ๋ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ๆ‰€ไปฅๅœจ dva ไธญ๏ผŒ้€šๅธธ้œ€่ฆ connect Model็š„็ป„ไปถ้ƒฝๆ˜ฏ Route Components๏ผŒ็ป„็ป‡ๅœจ/routes/็›ฎๅฝ•ไธ‹๏ผŒ่€Œ/components/็›ฎๅฝ•ไธ‹ๅˆ™ๆ˜ฏ็บฏ็ป„ไปถ๏ผˆPresentational Components๏ผ‰

์—ฌ๊ธฐ ๋งํฌ

์ด ๊ตฌ์ ˆ์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ์šฐํ„ฐ๋Š” ๋ฐ์ดํ„ฐ/๊ตฌ์„ฑ ์š”์†Œ ๋“ฑ์„ ์ˆ˜์ง‘ํ•˜๋Š” Route ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ˆœ์ˆ˜ ๊ธฐ๋Šฅ ๊ตฌ์„ฑ ์š”์†Œ์ด๊ณ  ์ˆœ์ˆ˜ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ˆ˜๋ช… ์ฃผ๊ธฐ ์ด๋ฒคํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

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