2.5.17
https://codesandbox.io/s/ppyq71wrxj
(์ต์ ์ฌํ ์ฐธ์กฐ)
:srcObject.prop
๋ฅผ ์ผ๋ถ ๋ฐ์ดํฐ ์์ฑ์ ๋ฐ์ธ๋ฉํ๋ HTMLMediaElement
๊ฐ ์๋ ๊ตฌ์ฑ ์์๊ฐ ์์ต๋๋ค( null
).<audio :srcObject.prop="stream">
MediaStream
.this.stream = new MediaStream();
null
๋ค์ ์ค์ ํ์ญ์์ค.this.stream = null;
audio.srcObject๊ฐ null์ผ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
MediaStream์ผ๋ก ์ ์ง๋๊ณ ๋ก๊ทธ์ TypeError๊ฐ ์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ์ฌํ ์์ ๋ฅผ ์์ฑํ๋ ค๋ ์ฒซ ๋ฒ์งธ ์๋์์ ์ค์ ๋ก ์๋ํ๋ค๋ ๊ฒ์ ์์์ฐจ๋ ธ์ต๋๋ค: https://jsfiddle.net/4tnkapxo/1/ (์๋ง๋ ์ ์ฒด๊ฐ ์ธ๋ผ์ธ์ด๊ธฐ ๋๋ฌธ์?)
์ด๊ฒ์ด ์ผ๋ง๋ ์ ์ฉํ์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์คํ ์ถ์ ์ ๊ธฐ๋ฐ์ผ๋ก updateDOMProps
์๋ ์ด ์ฝ๋์ ๊ด๋ จ์ด ์์ต๋๋ค.
for (key in oldProps) {
if (isUndef(props[key])) {
elm[key] = '';
}
}
isUndef(null)
๋ true๋ก ํ๊ฐ๋๋ฏ๋ก ์ํ์ ''
๋ก ์ค์ ํ๋ ค๊ณ ํ์ง๋ง srcObject
๊ตฌ์ฒด์ ์ผ๋ก null
๋๋ MediaStream
์ฌ์ผ ํฉ๋๋ค.
.prop
๋ฐ์ธ๋ฉ์ ๋ณํ์ ์ ์ฉํ๋ฉด ์ ๋ฉ๋๋ค.
์ด์ ๋ฌธ์ ์ ์ฝ๋(src/platforms/web/runtime/modules/dom-props.js์ updateDOMProps
)๋ฅผ ์ดํด๋ณด์์ผ๋ฏ๋ก ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์กฐ๊ธ ๋ ์ ์ดํดํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค. ์ฐ๊ฒฐ๋ ํ
์คํธ ์ผ์ด์ค(unit/modules/vdom/modules/dom-props.spec.js)๋ ์ญ์ ๋ฅผ ๋ฐฉ์งํ๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค.
it('should remove the elements domProps', () => {
const vnode1 = new VNode('a', { domProps: { src: 'http://localhost/' }})
const vnode2 = new VNode('a', { domProps: {}})
patch(null, vnode1)
const elm = patch(vnode1, vnode2)
expect(elm.src).toBe('')
})
...์ธํฐ๊ฐ ์ ์ํ ์์์ ๊ฐ์ผ๋ก ์ค์ ํ๋ ๊ฒ ์ธ์ HTMLEmelent
์์ฑ์ "์ญ์ "ํ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ์์ต๋๋ค. ๊ทธ๋ฐ ์๋ฏธ์์ elm[key] = '';
๋ก ๋น ๋ฌธ์์ด๋ก ์บ์คํ
ํ๋ ๊ฒ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ค ๋ฐฉ์์ ๊ฐ์ฅ ๊ฐ๊น์ต๋๋ค. <img>
ํ๊ทธ์ ๊ฒฝ์ฐ .src
์ํ์ ๋น ๋ฌธ์์ด ์์ ์ค์ ํ๋ฉด ๊ฝค ๋ถ์พํ ๋์์ด ๋ฐ์ํฉ๋๋ค.
09:48:05.267 const img = document.createElement('img')
09:48:08.948 img.src
09:48:08.953 ""
09:48:14.469 img.src = null
09:48:17.213 img.src
09:48:17.222 "https://localhost:8080/null"
(๋๋ ๊ทธ ํ๋์ ๋ํ ํฐ ์ด์ ๊ฐ ์๊ณ ํฉ๋ฒ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์๋ค๊ณ ํ์ ํฉ๋๋ค.)
๋ฐ๋ผ์ ํด๋น ์ปจํ
์คํธ์์ ๋น ๋ฌธ์์ด์ null/undef props์ ๊ฒฝ์ฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก ํฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ๊ฐ์ฒ๋ผ ๋ณด์
๋๋ค. isUndef(props[key])
์ํ๋ฅผ props.hasOwnProperty(key)
๋ก ๋ณ๊ฒฝํ๊ฑฐ๋ undefined
์ ์ง์ ๋น๊ตํ๋ ์คํ์ ํ์ต๋๋ค. ํ๋ ๊ฒ์ ๋งค์ฐ ๊ฐ๋จํ์ง๋ง ์ค์ ๋ก๋ ๊ทธ๋ ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ์ฌ์ฉ์๊ฐ prop์ null๋ก ์ค์ ํ์ฌ ์ญ์ ํ๋ ๊ธฐ๋ฅ์ ์์กดํ๋ ๊ฒฝ์ฐ ์คํ ๊ฐ๋ฅํฉ๋๋ค. ์ด์ ๋ฒ์ ๊ณผ ํธํ๋์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ dom-props.js
ํน์ ์ผ์ด์ค ์์ฑ/์์ ์กฐํฉ์ ์ธ๊ธ์กฐ์ฐจ ํ๊ธฐ ์ด๋ ค์ธ ์ ๋๋ก ๋์ฐํฉ๋๋ค.
์ฆ, ๋ด๊ฐ ๊ฑฐ๊ธฐ์์ ๋๋ฌด ๋ง์ ๊ฐ์ ์ ํ๊ณ ์์ต๋๊น? ๊ทธ ์ฝ๋๋ ์์ ํ ์ vnode์์ ๋๋ฝ๋ ์ํ์ ๋ํ ๋ณดํธ์
๋๊น? ํ
์คํธ ์์ฑ์๊ฐ src
์์ฑ๋ง ๊ณ ๋ คํ ์ด์ ๋ ์คํจ์ ์์ธ์ด์๊ธฐ ๋๋ฌธ์
๋๊น? prop์ "์ญ์ "ํ ๋ ์ฌ์ฉ์๊ฐ ""
, null
๋ฐ undefined
์ค์์ ์ฌ๋ฐ๋ฅธ ๊ฐ์ ์ ๊ณตํ ๊ฒ์ผ๋ก ๊ธฐ๋ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์
๋๊น?
๋ฐ๋ฉด์ ๋ฐ์ธ๋ฉ๋ ์์ฑ๊ณผ ๊ด๋ จํ์ฌ ์ญ์ ์ ๋ํด ์ด์ผ๊ธฐํ๋ ๊ฒ์ ์ ๋ง ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค... <audio :srcObject.prop="stream">
์ ์์ ๊ฐ์ด stream
๊ณ์ฐ๋ ์์ฑ์ ๋ค์์ ์ํํด์ผ ํฉ๋๋ค. ๋ฌด์ธ๊ฐ๋ฅผ ๋ฐํํ๋ฏ๋ก {stream: {some: thing}}
๋ฅผ {}
๋ก ๋์ฒดํ ์ ์๋ ๋ด ์ดํด๋ฅผ ๋์ด์๋ vnode ๋ด๋ถ์ ๋ฌด์ธ๊ฐ๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
์์ ์ ์์ด ๊ด์ฐฎ๋ค๋ฉด hasOwnProperty
๊ฐ ์ฌ๋ฐ๋ฅธ ๊ฒ์ฌ๋ผ๊ณ ๊ฐ์ ํ๊ณ ๊ฒฐ๊ณผ๋ elm[key] = ''
์ฌ์ผ ํฉ๋๋ค(๋ด๊ฐ ๋งํ ๊ฒ์ฒ๋ผ "ํ์ค" ์ญ์ ๊ฐ ๋ชจ๋ , ๊ทธ๋ฆฌ๊ณ ์๋ง๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ ์ฉ๋๋ ๊ฒฝ์ฐ); ์ด๋ฒ ์ฃผ์ ํ ๋ฆฌํ์คํธ๋ฅผ ์์ฑํ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ์์ ํ ๋ณ๊ฒฝ์ด ์๋ ๊ฒฝ์ฐ ์๊ฐ์ ๋ณด๋ด๊ณ ์ถ์ง ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ด f11449d916a468651d4fd5024c37e3eebbc9941f์ ์ํด ์์ ๋์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
.prop
๋ฐ์ธ๋ฉ์ ๋ณํ์ ์ ์ฉํ๋ฉด ์ ๋ฉ๋๋ค.