Dva: React Hooks ๋ฐ dva์˜ ๋ฌธ์ œ

์— ๋งŒ๋“  2019๋…„ 06์›” 27์ผ  ยท  30์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: dvajs/dva

import { connect } from 'dva';
import React, { useEffect } from 'react';

const Page = props => {
  const { dispatch, text } = props;
  useEffect(() => {
    dispatch({ type: 'xxx/fetchText' });
  }, []);

 return <div>{text}</div>
}

export default connect(({ xxx }) => ({ text: xxx.text }))(Page);

์ด๋Ÿฐ ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด ํ™•์ธ ์‹œ react-hooks/exhaustive-deps React Hook useEffect has a missing dependency: dispatch. ๊ทœ์น™์— ๋”ฐ๋ผ ํ”„๋กฌํ”„ํŠธ๋ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ useEffect์˜ DependencyList์— ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹์ถ”๊ฐ€ํ•˜๋ฉด ๊ทธ ์•ˆ์˜ ์š”์ฒญ์ด ๊ณ„์†ํ•ด์„œ ์‹คํ–‰๋˜๋Š”๋ฐ, React Hooks๋ฅผ dva์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ํ• ๊นŒ์š”?

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

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

useDispatch, ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•œ ํ›„์—๋Š” ์—ฐ๊ฒฐํ•  ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ ๊ฒŒ์œผ๋ฅด๊ธฐ ์œ„ํ•ด ์ €์žฅ์†Œ์—์„œ ๋ชจ๋“  ํšจ๊ณผ์™€ ๋ฆฌ๋“€์„œ๋ฅผ ๊บผ๋‚ด๊ณ  ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋ชจ๋“  ์ž‘์—…์„ ๋ฐ˜ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

function useActions(namespace) {
  const dispatch = useDispatch();

  const actions = useMemo(() => {
    const { _models } = getStore();
    const targetModel = _models.find(model => model.namespace === namespace);
    return targetModel ? Object.keys({ ...targetModel.effects, ...targetModel.reducers }).reduce((prev, curre) => {
      const actionName = curre.replace(new RegExp(`^${namespace}/`), '');
      prev[actionName] = payload => dispatch({ type: curre, payload });
      return prev;
    }, {}) : {};
  }, [namespace, dispatch]);

  return actions;
}

useDispatch, ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•œ ํ›„์—๋Š” ์—ฐ๊ฒฐํ•  ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ ๊ฒŒ์œผ๋ฅด๊ธฐ ์œ„ํ•ด ์ €์žฅ์†Œ์—์„œ ๋ชจ๋“  ํšจ๊ณผ์™€ ๋ฆฌ๋“€์„œ๋ฅผ ๊บผ๋‚ด๊ณ  ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋ชจ๋“  ์ž‘์—…์„ ๋ฐ˜ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

function useActions(namespace) {
  const dispatch = useDispatch();

  const actions = useMemo(() => {
    const { _models } = getStore();
    const targetModel = _models.find(model => model.namespace === namespace);
    return targetModel ? Object.keys({ ...targetModel.effects, ...targetModel.reducers }).reduce((prev, curre) => {
      const actionName = curre.replace(new RegExp(`^${namespace}/`), '');
      prev[actionName] = payload => dispatch({ type: curre, payload });
      return prev;
    }, {}) : {};
  }, [namespace, dispatch]);

  return actions;
}

image
๊ณต๋ฌด์›์€ useDispatch() ์‚ฌ์šฉ์„ ์ œ๊ฑฐํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.
์ง€๊ธˆ
image์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉ

@UlyC ๋Š” ์–ด๋””์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ๋งํฌ๋ฅผ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@UlyC ๋Š” ์–ด๋””์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ๋งํฌ๋ฅผ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ํ‹€๋ ธ์–ด.
https://reactjs.org/docs/hooks-reference.html ์˜ ๊ณต์‹ React Hooks API์—๋Š” useDispatch() ์‚ฌ์šฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ react-redux์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ react-redux https://react-redux.js.org/next/api/hooks#useddispatch ์˜ ์‚ฌ์šฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
import { useDispatch } from 'react-redux'

@UlyC ๋Š” ์–ด๋””์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ๋งํฌ๋ฅผ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ํ‹€๋ ธ์–ด.
https://reactjs.org/docs/hooks-reference.html ์˜ ๊ณต์‹ React Hooks API์—๋Š” useDispatch() ์‚ฌ์šฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ react-redux์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ react-redux https://react-redux.js.org/next/api/hooks#useddispatch ์˜ ์‚ฌ์šฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
import { useDispatch } from 'react-redux'

= - ๊ธ€์Ž„

~ const dispatch = useDispatch(); hooks dva๊ฐ€ ์•ฝ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ~
ํšจ๊ณผ๋Š” dva์˜ ์•ฝ์†์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

dva/umi๊ฐ€ ํ›„ํฌ ํ†ตํ•ฉ์„ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๊นŒ? ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ด๋ ‡๊ฒŒ import { useDispatch } from 'react-redux' ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๋ฉ์ด ์žˆ์„๊นŒ์š”?

image

์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ๋ฌธ์ œ์—†์–ด์š”

@yoyo837
````
'dva'์—์„œ { useDispatch } ๊ฐ€์ ธ์˜ค๊ธฐ;

console.log('6:23:08 PM', useDispatch)
````
์ด๋ ‡๊ฒŒ undefined๋ฅผ ์ถœ๋ ฅํ•˜๋Š”๋ฐ react-redux๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•ด์•ผ ํ•˜๋‚˜์š”?์–ด๋–ค ๋ฒ„์ „์œผ๋กœ?

dva ์ตœ์‹  ๋ฒ ํƒ€ ์—…๊ทธ๋ ˆ์ด๋“œ

๋‹น์‹ ์€ ๋” ๋‚˜์€ ๋ฆด๋ฆฌ์Šค๋ฅผ๋ณด๊ณ 

์—…๊ทธ๋ ˆ์ด๋“œ ํ›„ ๋ฌธ์„œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์‹ถ์€๋ฐ useDispatch ํ•จ์ˆ˜๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

dva ์€ react-redux useDispatch ์—์„œ ์ง์ ‘ ํŒŒ์ƒ๋ฉ๋‹ˆ๋‹ค. react-redux ๋ฌธ์„œ๋ฅผ ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

image

https://react-redux.js.org/api/hooks#useddispatch

1. dva๋ฅผ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค(๋‚ด ๋ฒ„์ „์€ 2.6.0-beta.12).
2.image

์ฐธ์กฐ ์ฃผ์†Œ: https://react-redux.js.org/api/hooks
๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค

Antd Pro V4๋Š” 2.6beta 12๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ๋˜์–ด ์ •์ƒ์ ์œผ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‚˜ ์—ฐ๊ฒฐ ๋ณด๊ณ  ํ˜•์‹์ด ํ‹€๋ฆฝ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ TableList์˜ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€, ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋‚˜์š”?

ไฝœไธบ่กจ่พพๅผ่ฐƒ็”จๆ—ถ๏ผŒๆ— ๆณ•่งฃๆž็ฑปไฟฎ้ฅฐๅ™จ็š„็ญพๅใ€‚
  ไธ่ƒฝๅฐ†็ฑปๅž‹โ€œConnectedComponentClass<typeof TableList, Pick<TableListProps, "form" | "wrappedComponentRef">>โ€ๅˆ†้…็ป™็ฑปๅž‹โ€œtypeof TableListโ€ใ€‚
    Type 'Component<Pick<TableListProps, "form" | "wrappedComponentRef">, any, any>' is missing the following properties from type 'TableList': columns, handleStandardTableChange, handleFormReset, toggleForm, and 10 more.

@wangzhipeng404 ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์—ฐ๊ฒฐํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ pro ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋ ˆ์ด์•„์›ƒ๊ณผ ๋ธ”๋ก์€ conect๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ง์ ‘ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์˜ค๋ฅ˜๋ฅผ ๋น ๋ฅด๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ–ˆ๋Š”๋ฐ ๋‹ค์Œ ์ฝ”๋“œ๋Š” ์ •์ƒ์ ์œผ๋กœ ์ž‘์„ฑ๋˜์–ด ์ •์ƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

import React, { Component } from 'react';
import { connect } from 'dva';
import ProductList from '../components/ProductList';

@connect(({ products }) => ({
  products,
}))
export default class Products extends Component {
  componentDidMount() {
    const { dispatch } = this.props;
    dispatch({
      type: 'products/fetch',
    });
  }
  handleDelete = id => {
    const { dispatch } = this.props;
    dispatch({
      type: 'products/delete',
      payload: id,
    });
  };
  render() {
    const { products } = this.props;
    return (
      <div>
        <h2>List of Products</h2>
        <ProductList onDelete={this.handleDelete} products={products} />
      </div>
    );
  }
}

๋‚˜์ค‘์— https://react-redux.js.org/next/api/hooks ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ํ›„ํฌ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

import React, { useEffect } from 'react';
// import { connect } from 'dva';
import ProductList from '../components/ProductList';
import { useSelector, useDispatch } from 'react-redux';

// https://react-redux.js.org/next/api/hooks

export default function Products() {
  console.info(`useDispatch: `,useDispatch)
  const dispatch = useDispatch();
  const products = useSelector(state => state.products);
  useEffect(() => {
    dispatch({
      type: 'products/fetch',
    });
  });
  const handleDelete = id => {
    dispatch({
      type: 'products/delete',
      payload: id,
    });
  };
  return (
    <div>
      <h2>List of Products</h2>
      <ProductList onDelete={handleDelete} products={products} />
    </div>
  );
}

ํ•˜์ง€๋งŒ ์ด๋ฒˆ์—๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

image

ํ›„ํฌ ์ง€์›์„ ๊ฐ•๋ ฅํžˆ ํฌ๋งํ•ฉ๋‹ˆ๋‹ค.

@liudonghua123 ์ด ์ด๋ฒˆ์—๋Š” dva ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋“ฏ ์žฌ๋นจ๋ฆฌ ๋ฌป๋Š”๋‹ค.์•„๋ž˜ ์ฝ”๋“œ๋Š” dva๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ react-redux์—์„œ ์š”๊ตฌํ•˜๋Š” ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค., dva๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด์ƒํ•ฉ๋‹ˆ๋‹ค.

@liudonghua123 ์œ„์˜ ์†Œ์œ„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์˜ˆ์ œ๋Š” dva ์ดˆ๊ธฐํ™”๋ฅผ ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ dva๋Š” connect, useSelector ๋ฐ ๊ธฐํƒ€ react-redux ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.

@yoyo837 ์œ„์—์„œ ์ •์ƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋Š” ์ฝ”๋“œ์˜ ์ผ๋ถ€์ด๊ณ  dva ์ดˆ๊ธฐํ™” ๋ถ€๋ถ„์€ ๋‹ค๋ฅธ ๊ณณ์— ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์— ๋‹ค ์“ฐ์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” https://dvajs.com/guide/getting- ์„ ์ฐธ์กฐํ•˜์—ฌ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com/liudonghua123/dva-quickstart/blob/hooks/src/routes/Products.js ํ›„ํฌ ๋ถ„๊ธฐ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ  ๋งˆ์Šคํ„ฐ ๋ถ„๊ธฐ๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ dva ์—์„œ 2.6.0-beta.14 ๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ์‹œ๋„ํ–ˆ๋Š”๋ฐ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์ •์ƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ†ตํ•ฉ์„ ์œ„ํ•ด useSelector , useDispatch ์—์„œ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. dva ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” ๋ชจ๋“  ์ˆ˜์ • ์‚ฌํ•ญ์ด ์กฐ๊ธˆ ๋” ์ข‹์Šต๋‹ˆ๋‹ค.
https://github.com/liudonghua123/dva-quickstart/commit/f9bd1dd1332e62739d15050c4d50bc069a7fb58f

ํ•˜์ง€๋งŒ pro ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋ ˆ์ด์•„์›ƒ๊ณผ ๋ธ”๋ก์€ conect๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ง์ ‘ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์˜ค๋ฅ˜๋ฅผ ๋น ๋ฅด๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š”, ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์…จ๋‚˜์š”?antd-pro-ts์— ์‚ฌ์šฉ๋œ dva_beta ๋ฒ„์ „์ด ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

could not find react-redux context value; please ensure the component is wrapped in a <Provider>

์•ˆ์— ๋‚ด์šฉ๋ฌผ์ด ๋งŽ์ด ๋“ค์–ด์žˆ๋Š” ๋Š๋‚Œ

@liudonghua123 ์œ„์˜ ์†Œ์œ„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์˜ˆ์ œ๋Š” dva ์ดˆ๊ธฐํ™”๋ฅผ ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ dva๋Š” connect, useSelector ๋ฐ ๊ธฐํƒ€ react-redux ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.

๋ง์ด ๋ผ ์ง„์งœ ์„ž์ผ ์ˆ˜ ์—†์„ ๊ฒƒ ๊ฐ™์•„ ๊ฐ™์€ ์›๋ฆฌ๊ฐ€ ์•„๋‹ˆ์•ผ

Antd Pro V4๋Š” 2.6beta 12๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ๋˜์–ด ์ •์ƒ์ ์œผ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‚˜ ์—ฐ๊ฒฐ ๋ณด๊ณ  ํ˜•์‹์ด ํ‹€๋ฆฝ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ TableList์˜ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€, ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋‚˜์š”?

ไฝœไธบ่กจ่พพๅผ่ฐƒ็”จๆ—ถ๏ผŒๆ— ๆณ•่งฃๆž็ฑปไฟฎ้ฅฐๅ™จ็š„็ญพๅใ€‚
  ไธ่ƒฝๅฐ†็ฑปๅž‹โ€œConnectedComponentClass<typeof TableList, Pick<TableListProps, "form" | "wrappedComponentRef">>โ€ๅˆ†้…็ป™็ฑปๅž‹โ€œtypeof TableListโ€ใ€‚
    Type 'Component<Pick<TableListProps, "form" | "wrappedComponentRef">, any, any>' is missing the following properties from type 'TableList': columns, handleStandardTableChange, handleFormReset, toggleForm, and 10 more.

์ €๋„ ์ด๋ฌธ์ œ์ธ๋ฐ ํ•ด๊ฒฐํ•˜์…จ๋‚˜์š”?

ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฐ๊ฒฐ์„ ๋‹ค์‹œ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฐ๊ฒฐ์„ ๋‹ค์‹œ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ธ€์Ž„, ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ๋Š” ์ด์ „์— ํด๋ž˜์Šค ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ ํ›„ํฌ๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ์ž‘์—…๋Ÿ‰์€ ์•ฝ๊ฐ„ ๋ฌด๊ฒ๊ณ  ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ๊ฒฝ๊ณ ๋Š” ๋„ˆ๋ฌด ์„ฑ๊ฐ€ ์‹œ๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์ตœ๊ทผ ํ™œ๋™์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ์˜ค๋ž˜๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ํ™œ๋™์ด ์—†์œผ๋ฉด ํ์‡„๋ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ธฐ์—ฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

https://github.com/dvajs/dva/issues/2140#issuecomment -507620628 ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค

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