为什么输入元素保留该值?第二次不应用数据绑定

Why is input element retaining the value? Data binding is not applying the second time

提问人:dman 提问时间:10/23/2023 最后编辑:dman 更新时间:10/24/2023 访问量:46

问:

使用点亮元素...我有这个元素称为单个事务。在交易列表页面中,我单击单个交易并转到包含单个交易的新页面。

在 notes 输入元素中:

  1. 我编辑输入并将“foo”更改为“bar”
  2. 我不保存
  3. 我回到主页。
  4. 然后,我回到同一个单一事务。

备注输入具有已编辑的值。它应该有,因为我没有保存值。为什么这个值会持续存在?似乎当我返回单事务元素时,数据绑定会显示原始值。这就像数据绑定逻辑没有再次运行并更新元素一样。barfoobar.singleTransData=${this.singleTransData}foo

在使用 bar 修改输入之前:enter image description here

当输入值保持不变而不保存时:enter image description here

parent 元素

      <single-transaction
        data-el="add-catergory"
        .singleTransData=${this.singleTransData}
        id="single-transaction"></single-transaction>

单交易元素:

  static properties = {                                                
    singleTransData: {                                                 
      type: Object,                                                    
    },                                                                 
    label: {                                                           
      type: String,                                                    
    },                                                                 
  };                                                                   
                                                                                                                                            
  constructor() {                                                      
    super();                                                           
    this.singleTransData = {};                                         
  }                                                                    
                                                                       
  render() {                                                           
                                                                       
    return html`                                                       
          <mwc-icon-button                                             
            @click=${this.#leavePage}                                  
            icon="arrow_back"></mwc-icon-button>                       
                                                                       
          <span class="row">                                           
            <md-outlined-text-field                                    
              label="notes"                                            
              data-key="notes"                                         
              value="${this.singleTransData.notes}"                    
              ></md-outlined-text-field>                               
          </span>                                                      
    `                                                                  
  } 
聚合物 点亮

评论


答:

1赞 Justin Fagnani 10/24/2023 #1

如果你在进入主页时保留包含 connected 的 DOM,比如说,要么只用 CSS 显示当前页面,要么使用指令,那么输入、它的当前值和与它的绑定都会被保留。<single-transaction>cache()

点亮的绑定会记住它们以前的值,并且仅在数据更改时更新 DOM。这意味着,对于更改其内部状态的元素,当您使用与之前渲染值相同的值重新渲染时,Lit 不会重置它。

也就是说,如果你用 Lit 和 value 渲染,在内部将值更改为 ,然后用 Lit 和 value 重新渲染,Lit 不会设置属性,因为它知道值是静止的,不需要更改。"foo""bar""foo""foo"

这只发生在修改自身内部状态的元素(在 React-land 中有时称为“不受控制的组件”)上。为了解决这个问题,Lit 有指令:https://lit.dev/docs/templates/directives/#livelive()

live()绕过 Lit 的内部绑定值存储,并始终根据绑定到的属性的实时值进行检查。

<md-outlined-text-field>already 用于绑定到它的内部,并在事件上更新它的属性,因此它的属性始终是最新的。您应该能够添加到模板中以实现相同的效果:live()<input>valueinputvaluelive()

            <md-outlined-text-field                                    
              label="notes"                                            
              data-key="notes"                                         
              value="${live(this.singleTransData.notes)}"
              ></md-outlined-text-field>  

评论

0赞 Augustine Kim 10/24/2023
这里要添加一些东西,它应该绑定到带有 .否则,它是属性绑定。.value