fix(runtime-core): should not warn unused attrs when accessed via setup context
close #625
This commit is contained in:
		
							parent
							
								
									c35fea3d60
								
							
						
					
					
						commit
						751d838fb9
					
				@ -326,4 +326,28 @@ describe('attribute fallthrough', () => {
 | 
			
		||||
      `<!----><div></div><div class="parent"></div><!---->`
 | 
			
		||||
    )
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  it('should not warn when context.attrs is used during render', () => {
 | 
			
		||||
    const Parent = {
 | 
			
		||||
      render() {
 | 
			
		||||
        return h(Child, { foo: 1, class: 'parent' })
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const Child = defineComponent({
 | 
			
		||||
      props: ['foo'],
 | 
			
		||||
      setup(_props, { attrs }) {
 | 
			
		||||
        return () => [h('div'), h('div', attrs)]
 | 
			
		||||
      }
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    const root = document.createElement('div')
 | 
			
		||||
    document.body.appendChild(root)
 | 
			
		||||
    render(h(Parent), root)
 | 
			
		||||
 | 
			
		||||
    expect(`Extraneous non-props attributes`).not.toHaveBeenWarned()
 | 
			
		||||
    expect(root.innerHTML).toBe(
 | 
			
		||||
      `<!----><div></div><div class="parent"></div><!---->`
 | 
			
		||||
    )
 | 
			
		||||
  })
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
@ -28,7 +28,10 @@ import {
 | 
			
		||||
} from '@vue/shared'
 | 
			
		||||
import { SuspenseBoundary } from './components/Suspense'
 | 
			
		||||
import { CompilerOptions } from '@vue/compiler-core'
 | 
			
		||||
import { currentRenderingInstance } from './componentRenderUtils'
 | 
			
		||||
import {
 | 
			
		||||
  currentRenderingInstance,
 | 
			
		||||
  markAttrsAccessed
 | 
			
		||||
} from './componentRenderUtils'
 | 
			
		||||
 | 
			
		||||
export type Data = { [key: string]: unknown }
 | 
			
		||||
 | 
			
		||||
@ -428,7 +431,12 @@ export const SetupProxySymbol = Symbol()
 | 
			
		||||
const SetupProxyHandlers: { [key: string]: ProxyHandler<any> } = {}
 | 
			
		||||
;['attrs', 'slots'].forEach((type: string) => {
 | 
			
		||||
  SetupProxyHandlers[type] = {
 | 
			
		||||
    get: (instance, key) => instance[type][key],
 | 
			
		||||
    get: (instance, key) => {
 | 
			
		||||
      if (__DEV__) {
 | 
			
		||||
        markAttrsAccessed()
 | 
			
		||||
      }
 | 
			
		||||
      return instance[type][key]
 | 
			
		||||
    },
 | 
			
		||||
    has: (instance, key) => key === SetupProxySymbol || key in instance[type],
 | 
			
		||||
    ownKeys: instance => Reflect.ownKeys(instance[type]),
 | 
			
		||||
    // this is necessary for ownKeys to work properly
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user