2.5.17
https://codesandbox.io/s/ppyq71wrxj
(рдиреНрдпреВрдирддрдо рд░реЗрдкреНрд░реЛ рджреЗрдЦреЗрдВ)
HTMLMediaElement
рд╕рд╛рде рдПрдХ рдШрдЯрдХ рд╣реИ рдЬреЛ :srcObject.prop
рдХреЛ рдХреБрдЫ рдбреЗрдЯрд╛ рдкреНрд░реЙрдкрд░реНрдЯреА рд╕реЗ рдмрд╛рдВрдзрддрд╛ рд╣реИ (рдЬреЛ null
рд░реВрдк рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ):<audio :srcObject.prop="stream">
MediaStream
:this.stream = new MediaStream();
null
:this.stream = null;
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ audio.srcObject рдЕрд╢рдХреНрдд рд╣реЛрдЧрд╛
рдпрд╣ MediaStream рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ рдФрд░ рд▓реЙрдЧ рдореЗрдВ TypeError рд╣реИред
рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд░реЗрдкреНрд░реЛ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рдореЗрд░реЗ рдкрд╣рд▓реЗ рдкреНрд░рдпрд╛рд╕ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рдерд╛: https://jsfiddle.net/4tnkapxo/1/ (рд╢рд╛рдпрдж рдЗрд╕рд▓рд┐рдП рдХрд┐ рдкреВрд░реА рдмрд╛рдд рдЗрдирд▓рд╛рдЗрди рд╣реИ?)
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдпрд╣ рдЗрд╕ рдХреЛрдб рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, updateDOMProps
рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛:
for (key in oldProps) {
if (isUndef(props[key])) {
elm[key] = '';
}
}
isUndef(null)
рд╕рддреНрдп рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкреНрд░реЛрдк рдХреЛ ''
рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди srcObject
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕реЗ null
рдпрд╛ MediaStream
рд╢рд╛рдпрдж рд╣рдореЗрдВ .prop
рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
рдЕрдм рдЬрдм рдореИрдВрдиреЗ рдкреНрд░рд╢реНрди рдореЗрдВ рдХреЛрдб ( updateDOMProps
src/platforms/web/runtime/modules/dom-props.js) рдореЗрдВ рджреЗрдЦрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рд╕рдВрдмрдВрдзрд┐рдд рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓рд╛ (рдЗрдХрд╛рдИ/рдореЙрдбреНрдпреВрд▓/vdom/рдореЙрдбреНрдпреВрд▓/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"
(рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЙрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдХрд╛рд░рдг рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рднреА рд╡реИрдз рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВред)
рддреЛ рдЙрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд┐рд╕реА рднреА рдЕрд╢рдХреНрдд / рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░реЙрдкреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдЪрд┐рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреА рддрд░рд╣ рд▓рдЧрддреА рд╣реИред рдореИрдВрдиреЗ isUndef(props[key])
рдЪреЗрдХ рдХреЛ props.hasOwnProperty(key)
рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕реАрдзреЗ undefined
рд╕реЗ рдЗрд╕рдХреА рддреБрд▓рдирд╛ рднреА рдХреА рд╣реИ ... рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕реА рдкреНрд░реЙрдк рдХреЛ рд╢реВрдиреНрдп рдкрд░ рд╕реЗрдЯ рдХрд░рдХреЗ рдЙрд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИрдВ; рдпрд╣ рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИред рдФрд░ dom-props.js
рдореЗрдВ рд╡рд┐рд╢реЗрд╖-рдЖрд╡рд░рдг рд╕рдВрдкрддреНрддрд┐/рддрддреНрд╡ рд╕рдВрдпреЛрдЬрди рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рднрдпрд╛рдирдХ рд▓рдЧрддрд╛ рд╣реИред
рдЙрд╕рдиреЗ рдХрд╣рд╛, рдХреНрдпрд╛ рдореИрдВ рд╡рд╣рд╛рдБ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдзрд╛рд░рдгрд╛рдПрдБ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдБ? рдХреНрдпрд╛ рд╡рд╣ рдХреЛрдб рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдирдП vnode рдореЗрдВ рд▓рд╛рдкрддрд╛ рдкреНрд░реЙрдкреНрд╕ рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рдЧрд╛рд░реНрдб рд╣реИ? рдХреНрдпрд╛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓реЗрдЦрдХ рдХреЗрд╡рд▓ src
рд╕рдВрдкрддреНрддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рдереЗ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рдлрд▓рддрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛? рдХреНрдпрд╛ рдпрд╣ рдЙрдореНрдореАрдж рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕реА рдкреНрд░реЙрдк рдХреЛ "рдбрд┐рд▓реАрдЯ" рдХрд░рддреЗ рд╕рдордп ""
, null
рдФрд░ undefined
рдмреАрдЪ рд╕реЗ рд╕рд╣реА рдореВрд▓реНрдп рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ?
рджреВрд╕рд░реА рдУрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдмрд╛рдзреНрдп рдЧреБрдгреЛрдВ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ рддреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ ... рдЬреИрд╕реЗ <audio :srcObject.prop="stream">
рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ stream
рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХреБрдЫ рд╡рд╛рдкрд╕ рдХрд░реЗрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдорд╛рди рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ vnode рдЗрдВрдЯрд░реНрдирд▓ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдореЗрд░реА рд╕рдордЭ рд╕реЗ рдкрд░реЗ рд╣реИ рдЬреЛ {stream: {some: thing}}
рдХреЛ {}
рд╕реЗ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред
рдпрджрд┐ рдЙрдкрд░реЛрдХреНрдд рд╕реБрдЭрд╛рд╡ рдареАрдХ рд▓рдЧрддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ hasOwnProperty
рд╡рд╣рд╛рдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдЬрд╛рдВрдЪ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдо elm[key] = ''
рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЬреИрд╕реЗ рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рдпрд╣ рдЙрддрдирд╛ рд╣реА рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬрд┐рддрдирд╛ рдХреЛрдИ "рдорд╛рдирдХ" рд╣рдЯрд╛рдПрдВред , рдФрд░ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдорд╛рдорд▓рд╛); рдореИрдВ рд╢рд╛рдпрдж рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рд▓рд┐рдЦреВрдВрдЧрд╛ред рд▓реЗрдХрд┐рди рдореИрдВ рд╕рдордп рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдЕрдЧрд░ рдпрд╣ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ f11449d916a468651d4fd5024c37e3eebbc9941f рджреНрд╡рд╛рд░рд╛ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рд╢рд╛рдпрдж рд╣рдореЗрдВ
.prop
рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП