React-dnd: ref์˜ React 16.3 createRef ์œ ํ˜•์— ๋Œ€ํ•œ ์ง€์› ์ถ”๊ฐ€

์— ๋งŒ๋“  2018๋…„ 04์›” 03์ผ  ยท  13์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: react-dnd/react-dnd

์ฝœ๋ฐฑ ์ฐธ์กฐ ๋Œ€์‹  ์ƒˆ๋กœ์šด createRef API(React 16.3.0์— ๋„์ž…๋จ)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์š”์†Œ์™€ ํ•จ๊ป˜ connectDragSource๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด TypeError: previousRef is not a function ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ์•ฑ์ด ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

https://github.com/facebook/react/pull/12162

enhancement

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

๊ฐ™์€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด์ „ ์ฝœ๋ฐฑ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋˜๋Œ๋ ค์•ผ ํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

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

๋ธŒ๋ผ์šฐ์ € ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    return (0, _react.cloneElement)(element, {
        ref: function ref(node) {
            newRef(node);

            if (previousRef) {
                previousRef(node); // << fails with new refs
            }
        }
    });

๊ฐ™์€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ฒ˜์Œ์œผ๋กœ ๋‚˜๋Š” ๋งˆ์นจ๋‚ด ์ƒˆ๋กœ์šด refs๋ฅผ ์‚ฌ์šฉํ•  ๊ธฐํšŒ๋ฅผ ์–ป์—ˆ๊ณ  react-dnd๊ฐ€ ๋ฐฉํ•ด๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์žฅ๊ธฐ์ ์œผ๋กœ findDOMNode๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ref๋ฅผ ๊ต์ฒดํ•˜๋Š” ์ „์ฒด react-dnd ๋ชจ๋ธ์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. React์— ์ƒˆ๋กœ์šด createRef ๋ฐ withRef๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ. ์ƒˆ๋กœ์šด forwardRef API . ๊ทธ๋ฆฌ๊ณ  ๋งŽ์€ API๊ฐ€ render props๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ง€๊ธˆ์€ previousRef๊ฐ€ current ์†์„ฑ์„ ๊ฐ€์ง„ ๊ฐ์ฒด์ธ์ง€ ํ™•์ธํ•˜๊ณ  ์ด๋ฅผ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•˜๋Š” ๋Œ€์‹  ์„ค์ •ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„์ง createRef()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜์ค‘์— ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ๊ธฐ์—์„œ ์›ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๋Š” ์ƒŒ๋“œ๋ฐ•์Šค๊ฐ€ ์ข‹์Šต๋‹ˆ๋‹ค.

๋‚˜๋„ ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
@darthtrevino https://codesandbox.io/s/733onvqwl6 ์•„๋งˆ๋„ ์ด ์ƒŒ๋“œ๋ฐ•์Šค๊ฐ€ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ™์€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด์ „ ์ฝœ๋ฐฑ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋˜๋Œ๋ ค์•ผ ํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

+1
React.createRef() ๋ฐ ref.current ํ•˜๋ฉด ์•ฑ์ด ๋‹ค์šด๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์–ธ์ œ ์ˆ˜์ •๋˜๋‚˜์š”?

์•„์ง ์ˆ˜์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค :/

๋‚˜๋Š” ์ด๊ฒƒ์„ ์กฐ์‚ฌํ•˜๊ธฐ ์œ„ํ•ด react-conf ์ดํ›„์— ์‹œ๊ฐ„์„ ํ• ์• ํ•  ๊ฒƒ์ด๋‹ค.

๋‹ค๋ฅธ ๋นˆ div ์•ˆ์— ref div๋ฅผ ์บก์Šํ™”ํ•˜์—ฌ ์ œ์•ˆ๋œ ๋Œ€๋กœ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ์‹œ:

 <div>
        <div
          style={{
            position: "relative",
            borderStyle: "dashed",
            width: 300,
            height: 200,
            position: "relative"
          }}
          ref={this.myRef}
        />
      </div>

๐Ÿ‘ ์ด @darthtrevino์— ๋Œ€ํ•œ ๋ชจ๋“  ์—…๋ฐ์ดํŠธ. ์—…๋ฐ์ดํŠธ๋ฅผ ๋“ฃ๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค

@darthtrevino ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์ • ์‚ฌํ•ญ์— ๋Œ€ํ•ด ETA๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ์ƒ๊ฐ์— ์˜ค๋Š˜์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์ž˜๋ผ๋‚ธ ๋ฆด๋ฆฌ์Šค์— ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

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