在使用Vdt的过程中,你也许会遇到这样一个问题:设置的属性,并不能渲染出来,例如:

    1. <input maxlength="10" />

上述例子中,设置的maxlength属性丢失了。要理解这个原因,可以看看这段介绍
Content attribute & IDL attribute
以及Virtual-Dom文档中对VNode的介绍

Content vs IDL attribute

Content attribute为小写风格lowercase,通过element.setAttribute() & element.getAttribute()
方法来设置&获取属性;

IDL attribute为驼峰风格lowerCamlCase
你可以像读取javascript对象一样来设置&获取属性,例如:element.foo

在Vdt中,使用的都是IDL attribute,而上述例子中,maxlength为Content attribute,
所以并不会渲染到html中,但是你可以这样访问该属性: element.maxlength === '10';

maxlength对应的IDL attribute为:maxLength,所以我们可以这样设置该属性

    1. <input maxLength="10" />

关于IDL attribute可以查看Web API
HTMLInputElement

不过你也不用担心这么多属性怎么去查,基本上只需要将属性名从lowercase改成lowerCamlCase即可

class & for

classfor这两个属性对应的IDL attribute分别为classNamehtmlFor,由于它们比较常见,
Vdt在内部已经自动将它们转换了,所以这两种属性写法都是合法的。

attributes属性

HTML所有元素都具有attributes属性,通过它设置的所有属性都会当做Content attribute,参见:attributes

因此通过attributes属性我们可以设置任意的自定义属性,例如:

    1. <input attributes={{maxlength: 10, hello: 'vdt', 'data-a': 'b'}} />

Boolean属性值

对于值为Boolean类型的属性,只接受Boolean类型的值,而且不能省略

  • "true""false"这样的字符串会被当做true处理
  • 省略属性值,并不会将html中属性值设为true,而是会当做false处理
  • 不能用attributes属性来设置Boolean值,因为所有attributes对象里的值,会转成String类型

例如下面这样设置是达不到目的的:

    1. <div>
    2. <input readOnly="false" value="设为false也不能写"/>
    3. <input readOnly value="等于没设,可以读写"/>
    4. <input attributes={{readonly: false}} value="设为false也不能写"/>
    5. </div>

正确的做法:

    1. <div>
    2. <input readOnly={false} value="设为false,正常读写"/>
    3. <input readOnly={true} value="设为true,只读"/>
    4. </div>