Vue起步(一)

一.vue介紹

  • 當下最火的三大前端框架當屬vue、react以及angular了
  • 爲什麼要學vue,因爲vue有很多優勢
  • vue比react、angular更容易上手,vue寫起來更加流暢、方便,vue的優化做的要比react好一些,vue的文檔更加好
  • vue是一套用於構建用戶界面的漸進式框架

二.vue的hello版本

1.hello vue

<body>
      <div id="a"></div>
      <div id="app">{{content}}</div>
      <div>{{content}}</div>

      <script>
          var dom = document.getElementById('a');
          dom.innerHTML = "hello vue"
          
          var app = new Vue({
              el:"#app",
              data:{
                  content:"hello vue"
              }
          })
      </script>
</body>
  • 首先創建了一個vue實例
  • el表示實例管理的區域,接管id爲app標籤裏的所有內容
  • data爲數據源
  • {{}}插值表達式可以調用data裏面的數據

2.加上一個定時器

  • 面向dom編程
      <div id="a"></div>


      <script>
          var dom = document.getElementById('a');
          dom.innerHTML = "hello vue"

          setTimeout(function () {
              dom.innerHTML = "hello world"
          },2000);
  • 面向數據編程

      <div id="app">{{content}}</div>

      <script>
          var app = new Vue({
              el:"#app",
              data:{
                  content:"hello vue"
              }
          })

          setTimeout(function () {
              app.$data.content = "hello world"
          },2000);
      </script>

總結:vue要我們只需要關注數據,數據改變,頁面就會跟着發生變化

三.使用vue.js實現簡單todoList

  • v-model:數據雙向綁定(input框值發生變化,vue實例中的inputValue也變化,相反也成立)
  • v-on:綁定事件(此處綁定點擊事件)
  • v-for:遍歷
<body>
      <div id="app">
           <input type="text" v-model="inputValue">
          <button v-on:click="btnClick">提交</button>
           <ul>
               <li v-for="item in list">{{item}}</li>
           </ul>
      </div>
      <script>
          var app = new Vue({
              el:"#app",
              data:{
                  inputValue:'',
                  list:[]
              },
              methods:{
                  btnClick:function () {
                      this.list.push(this.inputValue)
                      this.inputValue=''
                  }
              }
          })
      </script>
</body>

總結:vue沒有操作dom元素 一直都在操作數據

四.MVVM模式

1.傳統模式-MVP模式

在這裏插入圖片描述

  • Model-數據層 Presenter-業務邏輯的控制層 View-視圖層(頁面上的視圖展示)

  • Jquery實現一個todoList

<body>
      <div id="app">
          <input type="text" id="input">
          <button id="btn">添加</button>
          <ul id="list">
          </ul>
      </div>

       <script>
           function Page() {

           }

           $.extend(Page.prototype,{
               init:function () {
                    this.bindEvents()
               },
               bindEvents:function () {
                   var btn = $('#btn');
                   btn.on('click',$.proxy(this.handleBtnClick,this))
               },
               handleBtnClick:function () {
                   var inputElem = $('#input');
                   var inputValue = inputElem.val();
                   var ulElem = $("#list");
                   ulElem.append('<li>' + inputValue + '</li>');
                   inputElem.val('');
               }

           })
           var page = new Page();
           page.init();
       </script>
</body>
  • M比較弱 沒有通過ajax獲取遠程數據
  • 上面的dom div就是視圖
  • 控制器 點擊提交控制器會去執行,控制器可以調模型層 ajax請求 通過dom操作改變視圖,最核心的是presenter 控制器層,大量代碼寫在presenter層中,大量代碼都是做dom操作

2.MVVM模式

在這裏插入圖片描述

  • 雖然也有視圖層和模型層,但沒有presenter這層了,ViewModel不需要編寫,vue自帶的,所以只需要關注v和m
  • MVVM層中的M層,上面寫的標籤就是MVVM中的V層,數據改變 頁面改變 這個操作時VM層做的
  • vue層就是VM層
  • M層最重要
  • Jquery面向dom編碼,vue面向數據編碼,用vue代碼量大大減少,至少可以減少百分之30,就可以見到vue的強大

五.前端組件化

  • 頁面切分成一個一個部分,每個部分都可稱爲一個組件
  • 向下面這些一個一個部分,都可以稱爲組件
    在這裏插入圖片描述

六.使用組件化思想修改todoList

1.全局組件

  • 把li標籤變成一個組件
  • v-bind:向子組件傳遞綁定值
  • props:從父組件接受內容
 <div id="app">
           <input type="text" v-model="inputValue">
          <button v-on:click="btnClick">提交</button>
           <ul>
                <todo-item v-bind:content="item" v-for="item in list">${{item}}</todo-item>
           </ul>
      </div>
      <script>
          Vue.component("TodoItem",{
              props:['content'],
              template:'<li>{{content}}</li>'
          })
          var app = new Vue({
              el:"#app",
              data:{
                  inputValue:'',
                  list:[]
              },
              methods:{
                  btnClick:function () {
                      this.list.push(this.inputValue)
                      this.inputValue=''
                  }
              }
          })
      </script>

2.局部組件

  • 局部組件就像是創建一個對象
  • 然後把這個對象註冊到vue實例中
 <div id="app">
           <input type="text" v-model="inputValue">
          <button v-on:click="btnClick">提交</button>
           <ul>
                <todo-item v-bind:content="item" v-for="item in list">${{item}}</todo-item>
           </ul>
      </div>
      <script>
          var TodoItem = {
              props:['content'],
              template:'<li>{{content}}</li>'
          }
          var app = new Vue({
              el:"#app",
              components:{
                TodoItem:TodoItem
              },
              data:{
                  inputValue:'',
                  list:[]
              },
              methods:{
                  btnClick:function () {
                      this.list.push(this.inputValue)
                      this.inputValue=''
                  }
              }
          })
      </script>

七.簡單的組件間傳值

  • 父組件向子組件傳遞數據v-bind

  • 那麼子組件怎麼向父組件傳遞數據呢?(實現點擊每一項能夠刪除自己-下標是關鍵)

    • 向外觸發事件,比如delete
    • 父組件創建子組件同時監聽delete事件
  • v-on:click簡寫 @click

  • v-bind:index簡寫:index

<body>
      <div id="app">
           <input type="text" v-model="inputValue">
          <button v-on:click="btnClick">提交</button>
           <ul>
                <todo-item v-bind:content="item" :index="index" v-for="(item,index) in list" @delete="handleItemDelete">${{item}}</todo-item>
           </ul>
      </div>
      <script>
          var TodoItem = {
              props:['content','index'],
              template:'<li @click="handleItemClick">{{content}}</li>',
              methods:{
                  handleItemClick:function () {
                      this.$emit("delete",this.index)
                  }
              }
          }
          var app = new Vue({
              el:"#app",
              components:{
                TodoItem:TodoItem
              },
              data:{
                  inputValue:'',
                  list:[]
              },
              methods:{
                  btnClick:function () {
                      this.list.push(this.inputValue)
                      this.inputValue=''
                  },
                  handleItemDelete:function (index) {
                      this.list.splice(index,1)
                  }
              }
          })
      </script>
</body>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章