MVC學(xué)習(xí)記錄

MVC是什么事镣?

MVC是一種編程思路,或者說是一種程序架構(gòu)
注意:它不是框架

MVC將程序結(jié)構(gòu)分為三層:View(視圖層)揪胃、Model(數(shù)據(jù)層)璃哟、Controller(控制層)

  • View層:用戶展示信息喊递,只與Controller通信
  • Model層:主要用于處理數(shù)據(jù)随闪,只與Controller通信
  • Controller層:作為中間人,從View層接收信息骚勘,告訴Model層铐伴,Model層進行數(shù)據(jù)更新后撮奏,通知Controller,Controller再進行處理后告知View進行展示当宴。

這三個層每個都是一個獨立的部分畜吊,它們之間的交互要遵循一定的規(guī)則:View不能與Model直接聯(lián)系,必須通過Controller進行交互户矢。

如:


MVC模型.png

上圖展示的是一個MVC模型之間的數(shù)據(jù)流向玲献,可以看到View和Model是通過Controller來進行交互的

再以用戶上網(wǎng)為例進行說明,如下圖:


image.png

以用戶搜索“美食為例”梯浪,當(dāng)用戶按下Enter鍵發(fā)送請求捌年,該請求到了服務(wù)器(Controller),服務(wù)器本身并不存儲數(shù)據(jù)驱证,它會通知數(shù)據(jù)庫(Model)去找美食延窜,數(shù)據(jù)庫找到之后,將數(shù)據(jù)返回給服務(wù)器(Controller)抹锄,服務(wù)器對數(shù)據(jù)進行處理,然后生成頁面(View)顯示給用戶看荠藤,這便是一個MVC架構(gòu)的網(wǎng)址的執(zhí)行流程

針對于前端代碼的MVC

前端代碼中的MVC伙单,簡單描述就是:Controller監(jiān)聽View層(一般是DOM節(jié)點)的變化,然后通過Model層(數(shù)據(jù)層)哈肖,數(shù)據(jù)層進行數(shù)據(jù)的處理吻育,處理完成后通知Controller層,Controller再通知View層進行渲染

面試問題:

  • MVC是什么淤井?
  • MVVM是什么布疼?
  • React與Vue分別是什么?有什么區(qū)別币狠?

參考:《基于MVC的Javascript的富應(yīng)用》
注意:在前端領(lǐng)域看源代碼不是個很好的學(xué)習(xí)方式游两,一是因為更新?lián)Q代太快,二是大部分寫的一般漩绵,最重要的是要理解它背后的邏輯贱案,了解其原理

可以看下:preact這個庫,是react的精簡版止吐,只有4k代碼

image.png
image.png
image.png

MVC

  • M:數(shù)據(jù)宝踪,只與數(shù)據(jù)有關(guān)
  • V:視圖
  • C:控制操作,調(diào)用Model碍扔,渲染View

MVC就是將代碼分成3個層次瘩燥,

  • Model只與數(shù)據(jù)有關(guān),其他均不管不同;它是最地下的一層厉膀,是核心數(shù)據(jù)層
  • View只與HTML有關(guān),其他均不管,它是在最上面的一層站蝠,面向用戶
  • 而Controller汰具,是控制著Model和View,相當(dāng)于作為一個中間人的地址菱魔,當(dāng)Model數(shù)據(jù)更新了就調(diào)用View進行渲染留荔,當(dāng)檢測到View中操作,就調(diào)用Model 進行數(shù)據(jù)更改澜倦,更改完成后聚蝶,再執(zhí)行View進行渲染;

Controller監(jiān)聽View層藻治,如果View有變動碘勉,則對Model進行更新,更新完成后再進行渲染桩卵;

Controller同時可以監(jiān)聽Model層验靡,當(dāng)Model層有變動,則對View層進行修改

image.png

Model和View之間是不會相互操作的

//-------- View 視圖層
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Webpack-demos</title>
  </head>
  <body>
    <div class="modules">
      <div class="module1">
      </div>
      <div class="module2">
      </div>
      <div class="module3">
        <input type="text" name="number2">
        <button name="button2">點我</button>
      </div>

    </div>
    <script id="module2Template" type="text/x-handlerbars">
      <hr>
      <div>{{number}}</div>
      <hr>
      <button name="increase">加</button>
      <hr>
      <button name="decrease">減</button>
    </script>
    <script type="text/javascript" src="bundle.js"></script></body>
</html>

// Controller 類
import $ from 'jquery'
const Handlebars = require('handlebars');

class Controller{
  constructor(options){
    for(let key in options){
      this[key] = options[key]
    }
    this.$element = $(this.element)

    this.init && this.init()

    if(this.template && this.render){
      this.render()
    }
    this.bindEvents()
  }
  bindEvents(){
    for(let key in this.events){
      let parts = key.split(' ')
      let eventType = parts.shift()
      let selector = parts.join(' ')
      if(typeof this.events[key] === 'function'){
        this.$element.on(eventType, selector, this.events[key])
      }else if(typeof this.events[key] === 'string'){
        let methodName = this.events[key]
        this.$element.on(eventType, selector, this[methodName].bind(this))
      }
    }
  }
  render(){
    let template = (this.template[0] === '#') ? 
      (document.querySelector(this.template).innerHTML) : 
      this.template
    let html = Handlebars.compile(template)(this.model.data)
    this.$element.html(html)
  }
}

export default Controller
import Controller from './Controller'
import $ from 'jquery'

// ----------這是Model層
let model = {
  data: {
    number: 0
  },
  get(){
    return $.get('/data.json').then((response)=>{
      this.data = response
      return this.data
    })
  },
  increase(){ // 向服務(wù)器發(fā)請求
    return new Promise((resolve, reject)=>{
      setTimeout(()=>{
        console.log('500ms 過去了')
        this.data.number += 1
        resolve(this.data)
      },500)
    })
  },
  decrease(){ // 向服務(wù)器發(fā)請求
    return new Promise((resolve, reject)=>{
      setTimeout(()=>{
        console.log('500ms 過去了')
        this.data.number -= 1
        resolve(this.data)
      },500)
    })
  }
}
// ------------這是Controller實例
new Controller({
  element: '.module2',
  template: '#module2Template',
  model: model,
  events: {
    'click button[name=increase]': 'increase',
    'click button[name=decrease]': 'decrease',
  },
  init(){
    this.model.get().then(()=>{
      this.render()
    })
  },
  increase(){
    this.model.increase().then(()=>{
      this.render()
    })
  },
  decrease(){
    this.model.decrease().then(()=>{
      this.render()
    })
  }
})

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雏节,一起剝皮案震驚了整個濱河市胜嗓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钩乍,老刑警劉巖辞州,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異寥粹,居然都是意外死亡变过,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門涝涤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來媚狰,“玉大人,你說我怎么就攤上這事妄痪】Γ” “怎么了椎侠?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長侣姆。 經(jīng)常有香客問我碍讯,道長笑撞,這世上最難降的妖魔是什么还最? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上帕膜,老公的妹妹穿的比我還像新娘枣氧。我一直安慰自己,他們只是感情好垮刹,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布达吞。 她就那樣靜靜地躺著,像睡著了一般荒典。 火紅的嫁衣襯著肌膚如雪酪劫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天寺董,我揣著相機與錄音契耿,去河邊找鬼。 笑死螃征,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的透敌。 我是一名探鬼主播盯滚,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼酗电!你這毒婦竟也來了魄藕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤撵术,失蹤者是張志新(化名)和其女友劉穎背率,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嫩与,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡寝姿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了划滋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饵筑。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖处坪,靈堂內(nèi)的尸體忽然破棺而出根资,到底是詐尸還是另有隱情架专,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布玄帕,位于F島的核電站部脚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏裤纹。R本人自食惡果不足惜委刘,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望服傍。 院中可真熱鬧钱雷,春花似錦、人聲如沸吹零。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灿椅。三九已至套蒂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間茫蛹,已是汗流浹背操刀。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留婴洼,地道東北人骨坑。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像柬采,于是被迫代替她去往敵國和親欢唾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容