Polymer 聚合物/发光元件,子组件不';当父对象修改属性时,不会重新渲染

Polymer 聚合物/发光元件,子组件不';当父对象修改属性时,不会重新渲染,polymer,web-component,lit-element,polymer-3.x,lit-html,Polymer,Web Component,Lit Element,Polymer 3.x,Lit Html,基本上: 我将子组件放在父组件的html中 子组件在static get properties()对象中有一个属性title 在父组件中,我将子组件的title属性指定给父组件的static get properties()中没有的私有变量 稍后,在父组件内部的setTimeout中,我更改了私有变量的值 子组件不会重新渲染 //父组件内部 render(){ 返回html` ` } 构造函数(){ 超级(); 这个._privateVariable='lore ipsum' 设置超时(()



基本上:

  • 我将子组件放在父组件的html中

  • 子组件在
    static get properties()
    对象中有一个属性
    title

  • 在父组件中,我将子组件的
    title
    属性指定给父组件的
    static get properties()
    中没有的私有变量

  • 稍后,在父组件内部的
    setTimeout
    中,我更改了私有变量的值

  • 子组件不会重新渲染

//父组件内部
render(){
返回html`
`
}
构造函数(){
超级();
这个._privateVariable='lore ipsum'
设置超时(()=>{
此._privateVariable='123455667'
}, 10000)
}
现在,我知道如果我将
\u privatevaluate
放在父组件的
static get properties()
中,子组件将重新渲染,但这是因为整个父组件正在重新渲染

连接到DOM后,子组件将监视其标题属性,因此它应该意识到分配给它的值已更改并重新渲染

我不明白为什么我必须重新渲染整个父对象以使子对象重新渲染

使用开发人员控制台并访问DOM中的组件:

  • 如果我用javascript更改子组件的属性,子组件将完全重新渲染,而无需重新渲染整个父元素

  • 如果我编辑子组件的html并手动更改属性,那么子组件将非常好地重新渲染,而无需重新渲染整个父元素


这里我遗漏了什么?

在polymer中,只有在static get properties()部分声明属性时,才会监视/观察属性的变化。由于您没有在父组件的properties()节中声明“\u privatevaluate”,因此对它所做的任何更改都不会被注入到子组件中,因此不会更新该值。 在父级中声明“_privatevaluate”后更改其值时,不会重新加载完整的父级,而只加载将重新加载的子组件。 但是,如果您仍然需要不在父级中声明'\u privateVaraible',并且仍然需要更新,则可以更新子组件中的变量值,并将更新封装在函数中,然后从父级的setTimeout调用该函数。

我在GitHub上回答:

但这里有一份副本供其他读者阅读:

@dvolp子组件正在观察其title属性,但它没有观察父组件的_privateVariable属性。如果不在staticproperties对象中将_privatevaluate声明为LitElement属性,则父组件也不会观察到该属性

设置_privatevaluate时,需要重新呈现父对象,因为重新呈现是将子对象的title属性设置为_privatevaluate的当前值

此处的绑定仅在渲染上运行。如果未运行此操作,则无法设置title属性:

//父组件内部
render(){
返回html`
`
}
这正是为什么必须在父组件的静态属性对象中包含_privatevaluate,以便在设置它时,父组件会收到通知并重新呈现,从而在子组件上设置title属性