ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 计算属性和表单 ### 计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。例如: ~~~html <div id="example"> {{ message.split('').reverse().join('') }} </div> ~~~ 在这个地方,模板不再是简单的声明式逻辑。你必须看一段时间才能意识到,这里是想要显示变量 message 的翻转字符串。当你想要在模板中多次引用此处的翻转字符串时,就会更加难以处理。 所以,对于任何复杂逻辑,你都应当使用计算属性。 ~~~html <div id="example"> <p>Original message: "{{ message }}"</p> <p>Computed reversed message: "{{ reversedMessage }}"</p> </div> ~~~ ~~~javascript var vm = new Vue({ el: '#example', data: { message: 'Hello' }, computed: { // 计算属性的 getter reversedMessage: function () { // `this` 指向 vm 实例 return this.message.split('').reverse().join('') } } }) ~~~ ### 表单和双向数据绑定 你可以用 v-model 指令在表单 `<input>` 及 `<textarea>` 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇,但 v-model 本质上不过是语法糖。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。 v-model 会忽略所有表单元素的 value、checked、selected 特性的初始值而总是将 Vue 实例的数据作为数据来源。你应该通过 JavaScript 在组件的 data 选项中声明初始值。 ~~~html <div> <input type="text" v-model="msg"/> <p>{{msg}}</p> </div> ~~~ ~~~javascript export default{ data(){ return{ msg:"" } }, watch:{ msg:function(data){ if(data=="傻"){ console.log("想骂人?"); }else if(data == "傻x"){ console.log('你才x'); } } } } ~~~ ### 修饰符 **.lazy** 在默认情况下,v-model 在每次 input 事件触发后将输入框的值与数据进行同步 (除了上述输入法组合文字时)。你可以添加 lazy 修饰符,从而转变为使用 change 事件进行同步: ~~~html <!-- 在“change”时而非“input”时更新 --> <input v-model.lazy="msg" > ~~~ **.number** 如果想自动将用户的输入值转为数值类型,可以给 v-model 添加 number 修饰符: ~~~html <input v-model.number="age" type="number"> ~~~ 这通常很有用,因为即使在 type="number" 时,HTML 输入元素的值也总会返回字符串。 **.trim** 如果要自动过滤用户输入的首尾空白字符,可以给 v-model 添加 trim 修饰符: ~~~html <input v-model.trim="msg"> ~~~