1100+
在使用表单组件时,往往需要同时绑定值和 change 事件动态更新数据,当表单交互较多的场景下会有大量与业务无关的代码。快应用在
1100
开始引入 model 指令,使用 model 指令可以在框架内部对值进行绑定与更新,实现双向绑定的效果,简化代码逻辑。
通过本节,你将学会:
注意:使用 model 指令需要引擎版本>=1100 且 hap-toolkit 版本>=1.9.5。
model 指令在表单 <input>
、<textarea>
及 <select>
元素上创建双向数据绑定,它会根据控件类型自动选取正确的方法来更新元素。
model 在内部为不同的输入元素使用不同的属性并抛出不同的事件:
传统快应用开发使用表单组件时,我们往往需要同时绑定一个属性和 change 事件,如:
<template>
<input type="text" value="{{value}}" @change="updateValue"></input>
</template>
<script>
export default {
data: {
value: "input value"
},
updateValue(e) {
this.value = e.target.attr.value
}
}
</script>
当有多个表单组件时,开发者需要在 data 中定义多个 “value” 和分别绑定 change 事件来完成相关的业务开发。表单组件越多,这些非业务逻辑的代码也会越多,此时开发者可以使用 model 指令对该场景进行优化。
对于上面的例子,我们可以通过 model 指令,从而使用更简洁的代码来实现相同的功能:
<template>
<input type="text" model:value="{{newValue}}"></input>
</template>
<script>
export default {
data: {
newValue: "input value"
}
}
</script>
使用了 model 指令,当用户输入时,newValue 的值会自动更新,当代码中对 newValue 的值进行修改时,修改的值也会自动更新到屏幕上。类似的其他表单组件和不同类型的 input 都可以如此使用 model 指令。
model 指令本质上是一个语法糖,原理是在编译时为组件自动绑定了 change 事件,通过 change 事件为双向绑定的数据更新变更后的值,如以下代码:
<template>
<input type="text" value="{{ value }}" @change="changeValue"></input>
</template>
<script>
export default {
private: {
value: ''
},
changeValue(e) {
this.value = e.target.attr.value
}
}
</script>
所以请勿在使用 model 指令时,再为组件手动绑定 change 事件,如果同时使用 toolkit 编译时只会保留开发者定义的 change 事件,导致 model 指令失效。
如上图所示,我们可以使用以下三步来标识一个 model 指令:
model:
固定前缀,标识该属性为双向数据绑定属性model:
后面填写绑定的属性名当有多个复选框时,可以为 model:value 绑定一个数组,该数组将包含所有选中的 checkbox 的 value 值。下面是一个实例:
<template>
<div class="item-container">
<text>多个复选框,绑定到同一个数组:</text>
<div>
<input type="checkbox" id="jack" value="Jack" model:value="{{checkedNames}}"></input>
<label target="jack">Jack</label>
</div>
<div>
<input type="checkbox" id="john" value="John" model:value="{{checkedNames}}"></input>
<label target="john">John</label>
</div>
<div>
<input type="checkbox" id="mike" value="Mike" model:value="{{checkedNames}}"></input>
<label target="mike">Mike</label>
</div>
<text>Checked names: {{ checkedNames }}</text>
</div>
</template>
<script>
export default {
private: {
checkedNames: []
}
}
</script>
运行此段代码,当选中第 1、2 个 checkbox 时,打印 checkedNames 的值可以看到输出为 ['Jack', 'John']
对于单选按钮和选择框,开发者可以使用插值动态的修改绑定的值。而对于复选框来说,快应用提供了 true-value 和 false-value 属性来控制被选中/未选中时的值。
<template>
<div>
<input
type="checkbox"
model:value="{{toggle}}"
true-value="yes"
false-value="no"
></input>
<input type="button" value="获取 toggle 的值" @click="getToggle"></input>
</div>
</template>
<script>
export default {
data: {
toggle: 'yse'
},
getToggle() {
console.log(this.toggle) // 当选中时输出为 yes,没有选中时输出为 no
}
}
</script>
在自定义组件上开发者也可以使用 model 指令,下面是一个使用示例:
首先定义一个含有表单元素的自定义组件,在 input 的 change 时,触发 update:sampleName 事件将值向父级传递。 其中 update:
为固定前缀,sampleName
为当前组件和父级双向绑定的属性名称。
<!-- com.ux -->
<template>
<input type="text" value="{{sampleName}}" @change="$emit('update:sampleName', evt.value)"></input>
</template>
<script>
export default {
props: ['sampleName']
}
</script>
然后在其他页面中正常引入组件,并使用 model:sample-name
即可完成自定义组件的 sampleName
属性双向绑定。
<!-- index.ux -->
<import name="model-sample" src="./com.ux"></import>
<template>
<div>
<text>sampleName: {{name}}</text>
<model-sample model:sample-name="{{name}}"></model-sample>
</div>
</template>
<script>
export default {
data: {
name: "demo sample"
}
}
</script>