成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

從 jQuery 到 VUE 技術(shù)棧

qiangdada / 872人閱讀

摘要:當(dāng)前前端最火熱的框架當(dāng)屬,在學(xué)習(xí)之前先來看下的內(nèi)部是如何工作的。我們從最基本的頁面操作開始做起。書籍?dāng)?shù)量加減清零把占位符替換成數(shù)據(jù)事件相關(guān)的交給操作,有兩個(gè)重要的屬性初始化時(shí)需要傳入兩參數(shù)和,后面操作的都是在的都是在身上,而不是直接操作。

當(dāng)前前端最火熱的框架當(dāng)屬 VUE,在學(xué)習(xí) VUE 之前先來看下 VUE 的內(nèi)部是如何工作的。

我們從最基本的頁面操作開始做起。

用 jQuery 操作頁面

我們來實(shí)現(xiàn)一個(gè)頁面,當(dāng)點(diǎn)擊按鈕式,頁面上的數(shù)字增加或減少

書籍:《JavaScript高級(jí)程序設(shè)計(jì)》 數(shù)量:2

用 jQuery 操作它很容易實(shí)現(xiàn)需求

let log = console.log.bind(console)     //把console.log 替換成 log 少打點(diǎn)代碼
$(".addOne").on("click",()=>{
  let oldHtml = $(".number").text()
  let newHtml = oldHtml -0 +1
  $(".number").html(newHtml)
})
$(".minusOne").on("click",()=>{
  let oldHtml = $(".number").text()
  let newHtml = oldHtml -0 -1
  $(".number").html(newHtml)
})
$(".reset").on("click",()=>{
  $(".number").text("0")
})
axios 實(shí)現(xiàn) ajax

我們真實(shí)的需求是,當(dāng)點(diǎn)擊按鈕時(shí),操作的時(shí)數(shù)據(jù)庫里的數(shù)據(jù),而不是直接在頁面中操作。

這里引入一個(gè)庫axios,可以實(shí)現(xiàn)在前端模擬后臺(tái),它有一個(gè)重要的 API:interceptors,可以實(shí)現(xiàn)在它上面 Mock 數(shù)據(jù)

// 我們要的數(shù)據(jù)
let book = {
  name:"JavaScript高級(jí)程序設(shè)計(jì)",
  number:2,
  id:""
}
axios.interceptors.response.use((response)=>{
  //下面這句等價(jià)于 let {url,method,data} = response.config
  let {config:{url,method,data}} = response        // 這里的 data 是請(qǐng)求體
  if(url === "/book/1" && method === "get"){
     response.data = book    //這里的 data 是響應(yīng)體
  }else if(url === "/book/1" && method === "put"){
    data = JSON.parse(data)
    Object.assign(book,data)     //請(qǐng)求體 data,assign可實(shí)現(xiàn)局部更新
    response.data = book        //響應(yīng)體 data
  }
  return response
})

頁面中的數(shù)據(jù)我們應(yīng)該用占位符代替,數(shù)據(jù)獲取到之后 更新到頁面中

//剛進(jìn)入頁面后的數(shù)據(jù)加載
axios.get("/book/1").then(({data})=>{
  let oldHtml = $(".app").html()
  let newHtml = oldHtml.replace("__name__",data.name) 
    .replace("__number__",data.number)    //用真實(shí)數(shù)據(jù)替換占位符
  $(".app").html(newHtml)
})
$(".app").on("click",".addOne",()=>{
  let oldNumber = $(".number").text()
  let newNumber = oldNumber -0 +1
  axios.put("/book/1",{number:newNumber}).then(({data})=>{    //請(qǐng)求時(shí)更新最新數(shù)據(jù)
    $(".number").html(data.number)
  })
})
$(".app").on("click",".minusOne",()=>{
  let oldNumber = $(".number").text()
  let newNumber = oldNumber -0 -1
  axios.put("/book/1",{number:newNumber}).then(({data})=>{
    $(".number").html(data.number)
  })
})
$(".app").on("click",".reset",()=>{
  axios.put("/book/1",{number:0}).then(({data})=>{
    $(".number").html(data.number)
  })
})

這樣的意大利面條似的寫法,非常不利于后期維護(hù),我們應(yīng)該用 MVC 優(yōu)化下

用 MVC 優(yōu)化

獲取數(shù)據(jù),更新數(shù)據(jù)的事情交個(gè)model去做,model里面有三個(gè)屬性:data,fetch,updata;分別用來:data負(fù)責(zé)存儲(chǔ)最新數(shù)據(jù),fetch負(fù)責(zé)頁面加載時(shí)向服務(wù)器獲取數(shù)據(jù),并將數(shù)據(jù)存儲(chǔ)到data中,updata負(fù)責(zé)實(shí)時(shí)頁面操作時(shí),更新頁面數(shù)據(jù),并將最新數(shù)據(jù)保存到data中。

let model ={
  data:{    //model 內(nèi)部用來存儲(chǔ)數(shù)據(jù)
    name:"",
    number:0,
    id:""
  },
  fetch(id){
    return axios.get(`/books/${id}`).then((response)=>{
      this.data = response.data        //加載更新向 axios 獲取的數(shù)據(jù)
      return response      
    })
  },
  updata(id,data){
    return axios.put(`/books/${id}`,data).then((response)=>{
      this.data = response.data        //點(diǎn)擊按鈕向 axios 獲取最新數(shù)據(jù),請(qǐng)求中的 data 是最新數(shù)據(jù)
      return response
    })
  }
}

操作頁面交給view,view有三個(gè)屬性,分別是el、template、render;el負(fù)責(zé)視圖部分,也就是你需要操作的 DOM,template是虛擬的html,并通過render去渲染。

let view = {
  el:".app",
  template:`
    
書籍:《__name__》 數(shù)量:__number__
`, render(data){ let newHtml = this.template.replace("__name__",data.name) .replace("__number__",data.number) //把占位符替換成數(shù)據(jù) $(this.el).html(newHtml) } }

事件相關(guān)的交給controller操作,有兩個(gè)重要的屬性:init、bingEvents;初始化時(shí)需要傳入兩參數(shù)viewmodel,后面操作的都是在的viewmodel都是在controller身上,而不是直接操作model

let controller = {
  init({view,model}){
    this.view = view
    this.model = model
    this.bindEvents()
    this.model.fetch(1).then(()=>{  
      view.render(this.model.data)
    })
  },
  bindEvents(){
    $(this.view.el).on("click",".addOne",this.addOne.bind(this)) //這里 addOne 內(nèi)部的 this 應(yīng)該是點(diǎn)擊的那個(gè)元素,所以這里要綁一下 this
    $(this.view.el).on("click",".minusOne",this.minusOne.bind(this))
    $(this.view.el).on("click",".reset",this.reset.bind(this))
  },
  addOne(){
    console.log(1)
    let oldNumber = $(".number").text()
    console.log(2)
    let newNumber = oldNumber -0 +1
    console.log(3)
    this.model.updata(1,{number:newNumber}).then(()=>{
        $(".number").html(this.model.data.number)
    })
    console.log(4)
  },
  minusOne(){
    let oldNumber = $(".number").text()
    let newNumber = oldNumber -0 -1
    this.model.updata(1,{number:newNumber}).then(()=>{
      $(".number").html(this.model.data.number)
    })
  },
  reset(){
    this.model.updata(1,{number:0}).then(()=>{
      $(".number").html(this.model.data.number)
    })
  }    
}
controller.init({view:view,model:model})
優(yōu)化 MVC

現(xiàn)在是一個(gè)頁面,這也寫沒有關(guān)系,但如果有很多頁面,每個(gè)頁面中的view、model、controller都重復(fù)了,這里把一些公用的方法寫在原型上。

在頁面中使用model,只需要傳遞兩參數(shù)

function Model({data,resouce}){
  this.data = data
  this.resouce = resouce
}

Model.prototype.updata = function(id,data){
  return axios.put(`/${this.resouce}s/${id}`,data).then((response)=>{
    this.data = response.data
    return response
  })
}

Model.prototype.fetch = function(id){
    return axios.get(`/${this.resouce}s/${id}`).then((response)=>{
      this.data = response.data
      return response      
    })
}
let model = new Model({
  data:{
    name:"",
    number:0,
    id:""
  },
  resouce:"book"  
})

view也是,頁面使用時(shí),傳兩個(gè)參數(shù)就 ok 了

function View({el,template}){
  this.el = el
  this.template = template
}
View.prototype.render = function(data){ 
  let html = this.template    
  for(let key in data){    //遍歷傳進(jìn)來的參數(shù),用循環(huán)替換頁面中的占位符
    html = html.replace(`__${key}__`,data[key])
  }
  $(this.el).html(html)
}
let view = new View({
  el:".app",
  template:`
    
書籍:《__name__》 數(shù)量:__number__
` })

Controller公用的方法比較少,這里就沒有優(yōu)化了

VUE

理解了 MVC 之后再來看 VUE 就會(huì)很簡(jiǎn)單,VUE 簡(jiǎn)單來說就是 MVC 中的 V,但它和 MVC 有點(diǎn)區(qū)別,就是它需要model中的數(shù)據(jù)

let view = new Vue({
  el:".app",
  data:{
    book:{
       name:"我是書籍",
       number:0,
       id:"" 
     },
    n:1
  },
  template:`
    
書籍:《{{book.name}}》 數(shù)量:{{book.number}}
` }

VUE 會(huì)把data里的屬性提升為 Vue 的屬性,所以下面操作可以直接用Vue.name操作,而不是寫Vue.data.name,所以我們可以在這些屬性外面套一層book,用Vue.book就可以對(duì)這些屬性進(jìn)行批量操作。

Vue沒有render方法,那你會(huì)說它怎么實(shí)現(xiàn)渲染頁面呢?

它提供了一個(gè)叫created的方法,在里面直接修改Vuedata屬性,它就會(huì)自動(dòng)幫你渲染頁面

  created(){
    model.fetch(1).then(()=>{
      this.book = model.data
    })

當(dāng)然 VUE 的野心不止于此 ,它甚至幫你省下controllor,你都不需要進(jìn)行事件綁定



它在template,v-on:click的一個(gè)方法,它會(huì)幫你調(diào)用methods中的方法,你只需要將點(diǎn)擊執(zhí)行的函數(shù)寫在上面即可。

methods:{
    addOne(){
      model.updata(1,{number:this.book.number + (this.n-0)})
        .then(()=>{
          this.book = model.data
        })
    },
    minusOne(){
      model.updata(1,{number:this.book.number - (this.n-0)})
        .then(()=>{
          this.book = model.data
        })
    },
    reset(){
      model.updata(1,{number:0})
        .then(()=>{
          this.book = model.data
        })
    }
}    

學(xué)會(huì)了 MVC 之后在來看 VUE,就變的很簡(jiǎn)單

MVVM

VUE 還實(shí)現(xiàn)另一個(gè)雙向綁定的功能,我現(xiàn)在點(diǎn)擊按鈕只能+1-1,如果我要實(shí)現(xiàn)操作+n或減n呢?

這里用input實(shí)現(xiàn),在按鈕上面添加一行

N的值是{{n}}

當(dāng)然Vuedata中也要添加一個(gè)n

當(dāng)你在input中輸入相應(yīng)值時(shí),后面N的值會(huì)相應(yīng)變化,這就是 MVVM。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/97004.html

相關(guān)文章

  • 技術(shù)的沉淀

    摘要:我是一個(gè)從,,到的比較常規(guī)的技術(shù)棧過渡過程。第一授權(quán),微信授權(quán)分為靜默授權(quán)和彈皮授權(quán)目的就是獲取用戶信息取得用戶的唯一以便業(yè)務(wù)的開發(fā)。 我也是一個(gè)經(jīng)歷過柴米油鹽醬醋茶、嘗過酸甜苦辣咸的前端程序員。知道前端的東西入門簡(jiǎn)單,有深度卻很難;表似好看無比的應(yīng)用,其實(shí)背后邏輯復(fù)雜,然而要想成長(zhǎng)的更快,一定要學(xué)會(huì)站在巨人的肩膀上,學(xué)以師技以自長(zhǎng)。所以一些經(jīng)驗(yàn)非??少F,在此我想和大家分享一下我的經(jīng)驗(yàn)...

    JerryWangSAP 評(píng)論0 收藏0
  • 技術(shù)的沉淀

    摘要:我是一個(gè)從,,到的比較常規(guī)的技術(shù)棧過渡過程。第一授權(quán),微信授權(quán)分為靜默授權(quán)和彈皮授權(quán)目的就是獲取用戶信息取得用戶的唯一以便業(yè)務(wù)的開發(fā)。 我也是一個(gè)經(jīng)歷過柴米油鹽醬醋茶、嘗過酸甜苦辣咸的前端程序員。知道前端的東西入門簡(jiǎn)單,有深度卻很難;表似好看無比的應(yīng)用,其實(shí)背后邏輯復(fù)雜,然而要想成長(zhǎng)的更快,一定要學(xué)會(huì)站在巨人的肩膀上,學(xué)以師技以自長(zhǎng)。所以一些經(jīng)驗(yàn)非??少F,在此我想和大家分享一下我的經(jīng)驗(yàn)...

    e10101 評(píng)論0 收藏0
  • 技術(shù)的沉淀

    摘要:我是一個(gè)從,,到的比較常規(guī)的技術(shù)棧過渡過程。第一授權(quán),微信授權(quán)分為靜默授權(quán)和彈皮授權(quán)目的就是獲取用戶信息取得用戶的唯一以便業(yè)務(wù)的開發(fā)。 我也是一個(gè)經(jīng)歷過柴米油鹽醬醋茶、嘗過酸甜苦辣咸的前端程序員。知道前端的東西入門簡(jiǎn)單,有深度卻很難;表似好看無比的應(yīng)用,其實(shí)背后邏輯復(fù)雜,然而要想成長(zhǎng)的更快,一定要學(xué)會(huì)站在巨人的肩膀上,學(xué)以師技以自長(zhǎng)。所以一些經(jīng)驗(yàn)非??少F,在此我想和大家分享一下我的經(jīng)驗(yàn)...

    keke 評(píng)論0 收藏0
  • 技術(shù)的沉淀

    摘要:我是一個(gè)從,,到的比較常規(guī)的技術(shù)棧過渡過程。第一授權(quán),微信授權(quán)分為靜默授權(quán)和彈皮授權(quán)目的就是獲取用戶信息取得用戶的唯一以便業(yè)務(wù)的開發(fā)。 我也是一個(gè)經(jīng)歷過柴米油鹽醬醋茶、嘗過酸甜苦辣咸的前端程序員。知道前端的東西入門簡(jiǎn)單,有深度卻很難;表似好看無比的應(yīng)用,其實(shí)背后邏輯復(fù)雜,然而要想成長(zhǎng)的更快,一定要學(xué)會(huì)站在巨人的肩膀上,學(xué)以師技以自長(zhǎng)。所以一些經(jīng)驗(yàn)非常可貴,在此我想和大家分享一下我的經(jīng)驗(yàn)...

    fsmStudy 評(píng)論0 收藏0
  • [ 一起學(xué)React系列 -- 0 ] React技術(shù)學(xué)習(xí)路線

    摘要:的出現(xiàn)真可謂是前端界的福音,正與之宗旨所說,。據(jù)統(tǒng)計(jì),目前世界上有的項(xiàng)目使用了。技術(shù)棧學(xué)習(xí)路線直到前段時(shí)間筆者的朋友給推薦了一個(gè),真是欣喜若狂也更加堅(jiān)定了自己在繼續(xù)前進(jìn)的想法。這是一個(gè)外國(guó)友人總結(jié)的一套技術(shù)棧學(xué)習(xí)路線,先給傳送門。 我相信點(diǎn)進(jìn)來的同學(xué)都是沖著標(biāo)題來的,當(dāng)然本文也不會(huì)讓各位失望。不過在正式介紹標(biāo)題所述的內(nèi)容之前,我們不妨先放下技術(shù),一起回顧下自己做前端技術(shù)的心路歷程。 前...

    Java3y 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<