国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

微信小程序?qū)崿F(xiàn)頁面數(shù)據(jù)偵聽器,類似vue的watch

這篇具有很好參考價(jià)值的文章主要介紹了微信小程序?qū)崿F(xiàn)頁面數(shù)據(jù)偵聽器,類似vue的watch。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

既然小程序的組件已經(jīng)有Observer功能,那為什么還要手寫watch功能呢?

  1. Observer只能在Component中使用,沒法在Page中使用。若是想在Page中監(jiān)控某一數(shù)據(jù)的變化,Observer做不到。
  2. Observer屬于小程序的新功能,只能在高版本微信使用,低版本微信無法使用。公司的小程序就因?yàn)槭褂昧薕bserver功能,導(dǎo)致很多低版本微信用戶無法使用這個(gè)小程序。

?HTML代碼

<view>{{n1}}+{{n2}}={{sum}}</view>
<button bindtap="addn1">頁面中監(jiān)聽n1+1</button>
<button bindtap="addn2">頁面中監(jiān)聽n2+1</button>

新建一個(gè)watch.js文件存放監(jiān)聽器的邏輯函數(shù),代碼如下:

/**
 * 設(shè)置監(jiān)聽器
 */
export function setWatcher(page) {
  let data = page.data;
  let watch = page.watch;
  Object.keys(watch).forEach(v => {
      let key = v.split('.'); // 將watch中的屬性以'.'切分成數(shù)組
      let nowData = data; // 將data賦值給nowData
      for (let i = 0; i < key.length - 1; i++) { // 遍歷key數(shù)組的元素,除了最后一個(gè)!
          nowData = nowData[key[i]]; // 將nowData指向它的key屬性對(duì)象
      }
      let lastKey = key[key.length - 1];
      let watchFun = watch[v].handler || watch[v]; // 兼容帶handler和不帶handler的兩種寫法
      let deep = watch[v].deep; // 若未設(shè)置deep,則為undefine
      observe(nowData, lastKey, watchFun, deep, page); // 監(jiān)聽nowData對(duì)象的lastKey
  })
}
/**
* 監(jiān)聽屬性 并執(zhí)行監(jiān)聽函數(shù)
*/
function observe(obj, key, watchFun, deep, page) {
  var val = obj[key];
  // 判斷deep是true 且 val不能為空 且 typeof val==='object'(數(shù)組內(nèi)數(shù)值變化也需要深度監(jiān)聽)
  if (deep && val != null && typeof val === 'object') {
      Object.keys(val).forEach(childKey => { // 遍歷val對(duì)象下的每一個(gè)key
          observe(val, childKey, watchFun, deep, page); // 遞歸調(diào)用監(jiān)聽函數(shù)
      })
  }
  Object.defineProperty(obj, key, {
      configurable: true,
      enumerable: true,
      set: function(newVal) {
          watchFun.call(page, newVal, val); 
          val = newVal;
          if (deep) { // 若是深度監(jiān)聽,重新監(jiān)聽該對(duì)象,以便監(jiān)聽其屬性。
              observe(obj, key, watchFun, deep, page);
          }
      },
      get: function() {
          return val;
      }
  })
}
module.exports = {
  setWatcher: setWatcher
}

?在該文件中引入watch.js,

???tips:如果有多個(gè)頁面都需要使用watch監(jiān)聽,可以直接在app.js中引入該文件,注冊(cè)成全局函數(shù),這樣就不用每個(gè)文件都去引入watch.js了,只需要在使用的頁面onLoad的時(shí)候調(diào)用一次該函數(shù),就能愉快的使用watch了。

import { setWatcher } from '../../utils/watch';

?js代碼文章來源地址http://www.zghlxwxcb.cn/news/detail-771768.html

 data: {
    n1:1,
    n2:0,
    sum:0,
    obj: {},
  },
  addn1(){
    this.setData({
          n1:this.data.n1+1,
    })
  },
  addn2(){
    this.setData({
          n2:this.data.n2+1,
    })
  },
  onLoad(options) {
  // 在onload的時(shí)候調(diào)用一次監(jiān)聽函數(shù),然后就可以像vue一樣愉快的使用watch了
    setWatcher(this);
  },
  // 用法完全和vue一樣,也能實(shí)現(xiàn)對(duì)象的深度監(jiān)聽
  watch: {
    n1(n1) {
        console.log(n1)
        this.setData({
          sum:n1+this.data.n2
        })
    },
    n2(n2) {
      console.log(n2)
      this.setData({
        sum:n2+this.data.n1
      })
    },
    obj: {
      handler(v) {
       console.log(v)
      },
      deep: true
    }

  
},

到了這里,關(guān)于微信小程序?qū)崿F(xiàn)頁面數(shù)據(jù)偵聽器,類似vue的watch的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Vue學(xué)習(xí)-計(jì)算屬性和偵聽器

    1、計(jì)算屬性的定義和原理 1、定義:要用的屬性不存在,要通過已有屬性計(jì)算得來。 2、原理:底層借助了Objcet.defineproperty方法提供的getter和setter。 3、get函數(shù)什么時(shí)候執(zhí)行? ??(1) 初次讀取時(shí)會(huì)執(zhí)行一次。 ??(2)當(dāng)依賴的數(shù)據(jù)發(fā)生改變時(shí)會(huì)被再次調(diào)用。 4、優(yōu)勢(shì):與

    2023年04月18日
    瀏覽(28)
  • Vue中watch偵聽器用法

    watch 需要偵聽特定的數(shù)據(jù)源,并在單獨(dú)的回調(diào)函數(shù)中執(zhí)行副作用 watch第一個(gè)參數(shù)監(jiān)聽源 watch第二個(gè)參數(shù)回調(diào)函數(shù)cb(newVal,oldVal) watch第三個(gè)參數(shù)一個(gè)options配置項(xiàng)是一個(gè)對(duì)象{ immediate :true //是否立即調(diào)用一次 deep :true //是否開啟深度監(jiān)聽 flush :“pre” // 更新時(shí)機(jī) } flush配置項(xiàng) p

    2024年02月06日
    瀏覽(23)
  • VUE教程-基礎(chǔ)-計(jì)算屬性和偵聽器

    模板內(nèi)的表達(dá)式非常便利,但是設(shè)計(jì)它們的初衷是用于簡(jiǎn)單運(yùn)算的。在模板中放入太多的邏輯會(huì)讓模板過重且難以維護(hù)。例如: 在這個(gè)地方,模板不再是簡(jiǎn)單的聲明式邏輯。你必須看一段時(shí)間才能意識(shí)到,這里是想要顯示變量? message ?的翻轉(zhuǎn)字符串。當(dāng)你想要在模板中的多

    2024年02月17日
    瀏覽(26)
  • 二、基礎(chǔ)篇 vue計(jì)算屬性和偵聽器

    模板內(nèi)的表達(dá)式非常便利,但是設(shè)計(jì)它們的初衷是用于簡(jiǎn)單運(yùn)算的。在模板中放入太多的邏輯會(huì)讓模板過重且難以維護(hù)。例如: 在這個(gè)地方,模板不再是簡(jiǎn)單的聲明式邏輯。你必須看一段時(shí)間才能意識(shí)到,這里是想要顯示變量? message ?的翻轉(zhuǎn)字符串。當(dāng)你想要在模板中的多

    2024年01月18日
    瀏覽(21)
  • 【源碼系列#04】Vue3偵聽器原理(Watch)

    專欄分享:vue2源碼專欄,vue3源碼專欄,vue router源碼專欄,玩具項(xiàng)目專欄,硬核??推薦?? 歡迎各位ITer關(guān)注點(diǎn)贊收藏?????? 偵聽一個(gè)或多個(gè)響應(yīng)式數(shù)據(jù)源,并在數(shù)據(jù)源變化時(shí)調(diào)用所給的回調(diào)函數(shù) 第一個(gè)參數(shù)可以是不同形式的“數(shù)據(jù)源”:它可以是一個(gè) ref (包括計(jì)算屬性

    2024年02月04日
    瀏覽(94)
  • 【Spring Boot系列】- Spring Boot偵聽器Listener

    【Spring Boot系列】- Spring Boot偵聽器Listener

    什么事Web監(jiān)聽器?web監(jiān)聽器就是 Servlet中特殊的類 ,他們能幫助開發(fā)者監(jiān)聽web中的特定事件,比如ServletContext、HttpSession、ServletRequest的創(chuàng)建和銷毀;變量的創(chuàng)建、銷毀和修改等??梢栽谀承﹦?dòng)作前后增加處理,實(shí)現(xiàn)監(jiān)控等等。web監(jiān)聽器的使用場(chǎng)景有很多;Spring的監(jiān)聽器是一種

    2024年02月07日
    瀏覽(21)
  • Vue Composition API之偵聽器watch/watchEffect

    Vue Composition API之偵聽器watch/watchEffect

    在日常的開發(fā)中,很多時(shí)候我們需要去對(duì)一些狀態(tài)進(jìn)行監(jiān)聽,比如當(dāng)顯示學(xué)生的成績(jī)列表時(shí),我們使用一個(gè)學(xué)生的學(xué)號(hào)student_num作為請(qǐng)求成績(jī)的參數(shù),如果沒有監(jiān)聽機(jī)制,當(dāng)學(xué)號(hào)student_num改變時(shí),我們需要依賴用戶的操作去刷新成績(jī)。但是有了偵聽器,我們可以通過偵聽器去監(jiān)

    2024年02月08日
    瀏覽(21)
  • 【vue2】計(jì)算屬性(computed)與偵聽器(watch)詳解

    【vue2】計(jì)算屬性(computed)與偵聽器(watch)詳解

    ??博???????主: 初映CY的前說(前端領(lǐng)域) ??個(gè)人信條: 想要變成得到,中間還有做到! ??本文核心: 計(jì)算屬性與偵聽屬性的用法 目錄( 文末有給大家準(zhǔn)備好的Xmind思維導(dǎo)圖 ) 一、計(jì)算屬性computed ①默認(rèn)get()方法,僅是獲取值 ②不僅僅是獲取值,還具有修改屬性功能

    2024年01月16日
    瀏覽(20)
  • 使用事件偵聽器和 MATLAB GUI 查看 Simulink 信號(hào)研究

    使用事件偵聽器和 MATLAB GUI 查看 Simulink 信號(hào)研究

    ????????? 歡迎來到本博客 ???????? ??博主優(yōu)勢(shì): ?????? 博客內(nèi)容盡量做到思維縝密,邏輯清晰,為了方便讀者。 ?? 座右銘: 行百里者,半于九十。 ?????? 本文目錄如下: ?????? 目錄 ??1 概述 ??2 運(yùn)行結(jié)果 ??3?參考文獻(xiàn) ??4 Matlab代碼、Simulink 該

    2024年02月13日
    瀏覽(19)
  • Vue3前端開發(fā),watch偵聽器的深度監(jiān)聽和精確監(jiān)聽

    Vue3前端開發(fā),watch偵聽器的深度監(jiān)聽和精確監(jiān)聽

    Vue3前端開發(fā),watch偵聽器的深度監(jiān)聽和精確監(jiān)聽!今天和大家分享的內(nèi)容是,關(guān)于watch的深度偵聽和精確監(jiān)聽。 首先看一下,第一個(gè)案例,練習(xí)的是,深度監(jiān)聽的效果。默認(rèn)是淺的偵聽,是不會(huì)觸發(fā)回調(diào)函數(shù)的。 如圖,當(dāng)我們點(diǎn)擊按鈕,修改num值的時(shí)候,觸發(fā)了回調(diào)函數(shù),在

    2024年01月23日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包