BUI 計(jì)算屬性與偵聽器

2020-08-12 14:09 更新

1. computed 選項(xiàng)

模板不支持表達(dá)式, 模板盡量精簡(jiǎn), 把表達(dá)式定義到 computed 里面, 可以處理跟data相關(guān)的計(jì)算.

案例

案例截圖

例子1:

點(diǎn)擊按鈕的時(shí)候,a更新,并觸發(fā)頁面上的 aDouble 的dom更新.

js:

  1. var bs = bui.store({
  2. scope: "page", // 用于區(qū)分公共數(shù)據(jù)及當(dāng)前數(shù)據(jù)的唯一值
  3. data: {
  4. a: 2,
  5. },
  6. methods: {
  7. changeA: function (e) {
  8. this.a++;
  9. }
  10. },
  11. computed: {
  12. aDouble: function () {
  13. // a 改變的時(shí)候,會(huì)觸發(fā)乘法,并更新到dom
  14. return this.a * 2
  15. }
  16. }
  17. })

html:

  1. <!-- 綁定事件,點(diǎn)擊改變 a的值,并且會(huì)觸發(fā) aDouble 跟著一起改變 -->
  2. <div class="bui-btn" b-click="page.changeA">點(diǎn)擊1次,a+1,結(jié)果乘以2</div>
  3. <div class="container-xy">
  4. a: <b b-text="page.a" ></b>
  5. 結(jié)果: <b b-text="page.aDouble"></b>
  6. </div>

例子2:

通過b-modelfirstName,lastName 渲染出來, 并且當(dāng)input輸入修改的時(shí)候,會(huì)觸發(fā)fullName的修改. fullName 支持兩種方式設(shè)置.

  • function
  • object

區(qū)別: function方式,fullName的修改不會(huì)重新賦值到 firstName, lastName. 如果要實(shí)現(xiàn)雙向聯(lián)動(dòng)綁定, 則采用object方式, 以對(duì)象的方式. 查看例子3.

js:

  1. var bs = bui.store({
  2. scope: "page", // 用于區(qū)分公共數(shù)據(jù)及當(dāng)前數(shù)據(jù)的唯一值
  3. data: {
  4. firstName: "Hello",
  5. lastName: "BUI",
  6. },
  7. computed: {
  8. fullName: function() {
  9. var val = this.firstName + ' '+ this.lastName;
  10. return val;
  11. }
  12. },
  13. })

html:

  1. <ul class="bui-list">
  2. <li class="bui-btn bui-box clearactive">
  3. <label class="bui-label">姓: </label>
  4. <div class="span1">
  5. <div class="bui-value"><input type="text" value="" placeholder="請(qǐng)輸入" b-model="page.firstName"></div>
  6. </div>
  7. </li>
  8. <li class="bui-btn bui-box clearactive">
  9. <label class="bui-label">名: </label>
  10. <div class="span1">
  11. <div class="bui-value"><input type="text" value="" placeholder="請(qǐng)輸入" b-model="page.lastName"></div>
  12. </div>
  13. </li>
  14. </ul>
  15. <!-- firstName,lastName改變就會(huì)觸發(fā) fullName 的綁定 -->
  16. <div class="container-xy">
  17. 結(jié)果: <b b-text="page.fullName"></b>
  18. </div>

例子3:

雙向聯(lián)動(dòng)修改, bs.fullName = "BUI Best" 設(shè)置以后, 會(huì)把firstName,lastName 重新賦值.

js:

  1. var bs = bui.store({
  2. scope: "page", // 用于區(qū)分公共數(shù)據(jù)及當(dāng)前數(shù)據(jù)的唯一值
  3. data: {
  4. firstName: "Hello",
  5. lastName: "BUI",
  6. },
  7. computed: {
  8. // 2. 雙向聯(lián)動(dòng) fullName 改變,會(huì)觸發(fā)各自改變 firstName,lastName,
  9. fullName: {
  10. get: function () {
  11. return this.firstName + ' ' + this.lastName
  12. },
  13. set: function (newValue) {
  14. var names = newValue.split(' ')
  15. this.firstName = names[0]
  16. this.lastName = names[names.length - 1]
  17. }
  18. }
  19. },
  20. })

例子4:

登錄按鈕的狀態(tài), 當(dāng)firstName,lastName 有值的時(shí)候, 登錄按鈕可以點(diǎn)擊; disabled 狀態(tài)為false, 當(dāng)沒有值的時(shí)候, disabled 為 true 不能點(diǎn)擊.
disabled computed 綁定在登錄按鈕的b-class上, 有值沒值的時(shí)候, 會(huì)去修改class有沒有 disabled 樣式名.

js:

  1. var bs = bui.store({
  2. scope: "page", // 用于區(qū)分公共數(shù)據(jù)及當(dāng)前數(shù)據(jù)的唯一值
  3. data: {
  4. firstName: "",
  5. lastName: "",
  6. },
  7. computed: {
  8. disabled: function() {
  9. // 注意: 這里需要先緩存下來值再進(jìn)行判斷.
  10. var firstName = this.firstName,
  11. lastName = this.lastName;
  12. if( firstName && lastName ){
  13. return false;
  14. }else{
  15. return true;
  16. }
  17. }
  18. },
  19. })

html:

  1. <ul class="bui-list">
  2. <li class="bui-btn bui-box clearactive">
  3. <label class="bui-label">姓: </label>
  4. <div class="span1">
  5. <div class="bui-value"><input type="text" value="" placeholder="請(qǐng)輸入" b-model="page.firstName"></div>
  6. </div>
  7. </li>
  8. <li class="bui-btn bui-box clearactive">
  9. <label class="bui-label">名: </label>
  10. <div class="span1">
  11. <div class="bui-value"><input type="text" value="" placeholder="請(qǐng)輸入" b-model="page.lastName"></div>
  12. </div>
  13. </li>
  14. </ul>
  15. <div class="container-xy">
  16. <div b-class="page.disabled" class="bui-btn primary round">登錄</div>
  17. </div>

注意: disabled方法里面, 有個(gè)注釋提醒, 為何要先緩存? 因?yàn)榻?jīng)常我們習(xí)慣性的直接去判斷? 比如:

  1. if( this.firstName && this.lastName ){
  2. return false;
  3. }else{
  4. return true;
  5. }

當(dāng)初始值 firstNamelastName 為空的時(shí)候, if 只拿到 firstName 不正確, 就會(huì)跳到 true, 導(dǎo)致 lastName 改變的時(shí)候,不會(huì)重新執(zhí)行判斷條件. 這在computed是經(jīng)常見到的錯(cuò)誤, 如果你希望這些值都會(huì)改變 disabled, 那應(yīng)該先進(jìn)行緩存.

效果預(yù)覽

查看效果

2. watch 選項(xiàng)

watch 可以用來監(jiān)聽 data 里面的鍵值的變化以后處理其它事情. watch函數(shù)返回當(dāng)前監(jiān)聽變量的新值跟舊值newVal,oldVal. 比方下面的例子.

案例

案例截圖

例子4:

  1. var bs = bui.store({
  2. scope: "page", // 用于區(qū)分公共數(shù)據(jù)及當(dāng)前數(shù)據(jù)的唯一值
  3. data: {
  4. a: 2,
  5. b: 1,
  6. },
  7. methods: {
  8. changeA: function (e) {
  9. this.a++;
  10. }
  11. },
  12. watch: {
  13. a: function (newVal,oldVal) {
  14. this.b = this.a * 2;
  15. }
  16. }
  17. })

html:

  1. <!-- 綁定事件,點(diǎn)擊改變 a的值,并且會(huì)觸發(fā) b 跟著一起改變 -->
  2. <div class="bui-btn" b-click="page.changeA">點(diǎn)擊1次,a+1,結(jié)果乘以2</div>
  3. <div class="container-xy">
  4. a: <b b-text="page.a" ></b>
  5. 結(jié)果: <b b-text="page.b"></b>
  6. </div>

computed 的例子也可以用watch實(shí)現(xiàn).

  1. var bs = bui.store({
  2. scope: 'page',
  3. data: {
  4. firstName: 'Hello',
  5. lastName: 'BUI',
  6. fullName: 'Hello BUI'
  7. },
  8. watch: {
  9. firstName: function (val) {
  10. this.fullName = val + ' ' + this.lastName
  11. },
  12. lastName: function (val) {
  13. this.fullName = this.firstName + ' ' + val
  14. }
  15. }
  16. })

除了 watch 選項(xiàng)之外,您還可以使用命令式的 bs.watch 方法。可以實(shí)現(xiàn)分離式監(jiān)聽.

  1. bs.watch("firstName",function(val){
  2. this.fullName = val + ' ' + this.lastName
  3. })
  4. bs.watch("lastName",function(val){
  5. this.fullName = this.firstName + ' ' + val
  6. })

效果預(yù)覽

查看效果

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)