Vue基礎:資料繫結
模板語法
- v-once 指令 執行一次性地插值,當資料改變時,插值處的內容不會更新。
- 大括號會將資料解釋為純文字,而非 HTML 。為了輸出真正的 HTML ,你需要使用
v-html
指令 使用javascript表示式,只能包含單個表示式
{{ number + 1 }}{{ ok ? 'YES' : 'NO' }}{{ message.split('').reverse().join('') }} <div v-bind:id="'list-' + id"></div>
注意:只能訪問全域性變數,如Math、Date等;不應該在模板表示式中試圖訪問使用者定義的全域性變數。
Class 與 Style 繫結
繫結HTML Class
物件語法
<div class="static" v-bind:class="{ active: isActive, 'text-danger': hasError }"></div> <script> data: { isActive: true, hasError: false } </script> <!-- 可以直接繫結資料裡的一個物件 --> <div v-bind:class="classObject"></div> <script
陣列語法
<div v-bind:class="[activeClass, errorClass]"></div> <!-- 使用三元表示式 --> <div v-bind:class="[isActive ? activeClass : '', errorClass]"></div> <!-- 陣列語法中使用物件語法 --> <div v-bind:class="[{ active: isActive }, errorClass]"></div>
繫結內聯樣式
物件語法
<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div> <!-- 直接繫結物件 --> <div v-bind:style="styleObject"></div>
陣列語法
<div v-bind:style="[baseStyles, overridingStyles]"></div>
多重值
<div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div>
這會渲染陣列中最後一個被瀏覽器支援的值。在這個例子中,如果瀏覽器支援不帶瀏覽器字首的 flexbox,那麼渲染結果會是
display: flex
。
注意:當v-bind:style
使用需要特定字首的CSS屬性時,如transform
,Vue.js會自動偵測並新增相應的字首。
表單輸入繫結
上述已經提到<input v-model="message">
實現所謂的雙向,不過是<input v-bind:value='message' v-on:input="message = arguments[0]"
的語法糖。v-model
會忽略所有表單元素的 value
、checked
、selected
特性的初始值。因為它會選擇 Vue 例項資料來作為具體的值。
複選框
多個勾選框,繫結到同一個陣列:
<div id='example'>
<input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
<label for="jack">Jack</label>
<input type="checkbox" id="john" value="John" v-model="checkedNames">
<label for="john">John</label>
<input type="checkbox" id="mike" value="Mike" v-model="checkedNames">
<label for="mike">Mike</label>
<p>Checked names: {{ checkedNames }}</p>
</div>
<script>
new Vue({
el: '#example',
data: {
checkedNames: []
}
})
</script>
單選按鈕
<div id="example">
<input type="radio" id="one" value="One" v-model="picked">
<label for="one">One</label>
<br>
<input type="radio" id="two" value="Two" v-model="picked">
<label for="two">Two</label>
<p>Picked: {{ picked }}</p>
</div>
<script>
new Vue({
el: '#example',
data: {
picked: ''
}
})
</script>
選擇列表
<div id="example-5">
<select v-model="selected">
<option disabled value="">請選擇</option>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
<span>Selected: {{ selected }}</span>
</div>
如果 v-model
表達初始的值不匹配任何的選項,<select>
元素就會以”未選中”的狀態渲染。在 iOS 中,這會使使用者無法選擇第一個選項,因為這樣的情況下,iOS 不會引發 change 事件。因此,像以上提供 disabled 選項是建議的做法。
值繫結
對於單選按鈕,勾選框及選擇列表選項, v-model
繫結的 value 通常是靜態字串(對於勾選框是邏輯值):但是有時我們想繫結 value 到 Vue 例項的一個動態屬性上,這時可以用 v-bind
實現,並且這個屬性的值可以不是字串。
<!-- 複選框 -->
<input type="checkbox" v-model="toggle" :true-value="trueVal" :false-value="falseVal">
<!-- 單選框 -->
<input type="radio" v-model="pick" v-bind:value="value">
<!-- 列表 -->
<select v-model="selected">
<!-- 內聯物件字面量 -->
<option v-bind:value="{ number: 123 }">123</option>
</select>
<script>
const app = new Vue({
el: '#app',
data() {
return {
// 選中為'yes' 未選中為'false'
toggle: '',
trueVal: 'yes',
falseVal: 'no',
// 選中為'yes'
pick: '',
value: 'yes',
// 為物件
selected: '',
}
}
})
</script>
技巧: select元件都會提供label和value兩個值,供使用者對展示和賦值進行分別設定,這裡可以對value賦值整個物件,便於後續操作,單展示上不受任何影響!這在一些獲取選中值做後續條件的時候很有用。
<el-select v-model="value" multiple placeholder="請選擇">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item">
</el-option>
</el-select>
修飾符
.lazy
:新增該修飾符,從而轉變為在change
事件中同步,而非input
事件!請檢視: change和input區別.number
:將使用者的輸入值轉為 Number 型別.trim
:自動過濾使用者輸入的首尾空格
<div id="app">
<!-- v-bind -->
<my-component value="123"></my-component>
<my-component :value="123"></my-component>
<!-- v-model.lazy -->
<input type="text" v-model.lazy="value2"><span>{{value2}}</span>
<!-- v-model.number -->
<input type="text" v-model="value3"><span>{{typeof value3}}</span>
<input type="text" v-model.number="value4"><span>{{typeof value4}}</span>
</div>
說明:第一個<my-component>
元件的value值為string型別;第二個<my-component>
元件的value值為number型別;value2添加了.lazy修飾符,在使用者輸入值得過程中(input事件)並不會發生改變,失去焦點(change)才觸發改變;value3,value4初始型別取決於vue例項中data值得型別,但在使用者輸入過程中,value4會做型別轉換,轉換為Number型別。
完整示例參考地址:https://jsfiddle.net/381510688/7oe7LLtm/