Vue

1.MVVM框架

1.M:模型层(Model),主要负责业务数据相关;
2.V:视图层(View),顾名思义,负责视图相关,细分下来就是html+css层;
3.VM:(ViewModel)V与M沟通的桥梁,也可以看作为控制器,负责监听M或者V的修改,是实现MVVM双向绑定的要点;

MVVM支持双向绑定,意思就是当M层数据进行修改时,VM层会监测到变化,并且通知V层进行相应的修改,反之修改V层则会通知M层数据进行修改,以此也实现了视图与模型层的相互解耦;


2.初识Vue

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        <div id="d1">
            <p>{{mytxt}}</p>
        </div>
        <script>
            let vm=new Vue({
                el:'#d1',
                data:{
                    mytxt:'欢迎使用Vue.js'
                }
            })
        </script>
    </body>
</html>

3.Vue数据的绑定

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <!-- 引入vue -->
        <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
        <title></title>
    </head>
    <body>
        <div id="d2">
            <!-- 双向绑定 -->
            <input type="text" name="" id="" v-model="pname" />
            <br>
            <p>产品名称:{{pname}}</p>
            <!-- 单项绑定-->
            <input type="text" name="" id="" v-bind:value="price" />
            <br>
            <p>产品价格:{{price}}</p>
        </div>
        <script type="text/javascript">
            let sm=new Vue({
                el:'#d2',
                data:{
                    pname:'计算机',
                    price:1000
                }
            })
        </script>
    </body>
</html>

4.属行的绑定

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
        <title></title>
        <style type="text/css">
            .one{
                color: yellow;
            }
            .two{
                color: red;
            }
        </style>
    </head>
    <body>
        <div id="d">
            <p v-bind:class="bg">李济啊</p>
            <input type="button" name="" id="" value="点击换颜色" v-on:click="ccc" />
            <ul v-for="k in arr">
                <li>{{k}}</li>
            </ul>
            <input type="button" name="" id="" value="加++" v-on:click="addarr" />
        </div>
        <script type="text/javascript">
            let z=new Vue({
                el:'#d',
                data:{
                    bg:'one',
                    arr:[1,2,3]
                },
                methods:{
                    ccc(){
                        if(this.bg=='one'){
                            this.bg='two'
                        }else{
                            this.bg='one'
                        }
                    },
                    addarr(){
/*                      后台增加,页面不变
                        for(let k in this.arr){
                            this.arr[k]+=2
                        }
                        console.log(this.arr) */
                        //变异方法改变数组在页面的呈现
                        for(let k in this.arr){
                            this.arr.splice(k,1,this.arr[k]+=1)
                        }
                        
                    }
                }
            })
        </script>
    </body>
</html>

5.函数

<!DOCTYPE html>
<html>
   <head>
       <meta charset="utf-8">
       <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
       <title></title>
   </head>
   <body>
       <div id="d">
           <input type="button" name="" id="" value="点击" v-on:click="show" />
           <input type="button" name="" id="" value="点击" v-on:click="display" />
           <input type="button" name="" id="" value="增加" v-on:click="add"/>
           <p>运算结果{{num}}</p>
       </div>
       <script type="text/javascript">
           let z=new Vue({
               el:'#d',
               data:{
                   num:1
               },
               methods:{
                   //以匿名函数的形式声明
                   show:function(){
                       alert('欢迎使用Vue中的函数')
                   },
                   //非匿名函数不加function
                   display(){
                       alert('另一种形式的Vue函数声明')
                   },
                   add(){
                       this.num+=1;
                   }
               }
           })
       </script>
   </body>
</html>

6.函数之页面切换案例

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
        <style type="text/css">
            div{
                width: 200px;
                height: 200px;
                border: 1px solid blue;
            }
            .show{
                display: block;
            }
            .hide{
                display: none;
            }
            li{
                display: inline-block;
                border: 1px solid red;
            }
            #d1{
                background-color: yellow;
            }
            #d2{
                background-color: pink;
            }
            #d3{
                background-color: aqua;
            }
        </style>
    </head>
    <body>
        <div id="con">
        
            <ul>
                <li id="m1" v-on:click="xianshi2()">菜单1</li>
                <li id="m2" v-on:click="xianshi2()">菜单2</li>
                <li id="m3" v-on:click="xianshi2()">菜单3</li>
            </ul>
            <div v-show="num==0" id="d1">
                功能区1
            </div>
            <div v-show="num==1" id="d2">
                功能区2
            </div>
            <div v-show="num==2" id="d3">
                功能区3
            </div>
        </div>
        <script type="text/javascript">
            let vm=new Vue({
                el:'#con',
                data:{
                    num:0
                },
                methods:{
                    xianshi2(){
                        //获取当前被点击的li
                        let cur=event.srcElement;
                        //得到li所在的ul
                        let ul=cur.parentElement;
                        //获取所有li的集合
                        let lis=ul.children;
                        for(var i in lis){
                            if(lis[i]==cur){
                                this.num=i;
                                break;
                            }
                        }
                        console.log(this.num)
                    }
                }
            })          
            
        </script>
    </body>
</html>

7.监听器

<!DOCTYPE html>
<html>
  <head>
      <meta charset="utf-8">
      <title></title>
      <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
  </head>
  <body>
      <div id="port">
          <input type="button" name="" id="" value="改变" v-on:click="change()" />
      </div>
      <script type="text/javascript">
          let vm=new Vue({
              el:'#port',
              data:{
                  num:10
              },
              methods:{
                  change(){
                      this.num+=3;
                  }
              },
              //浅度监听器
              watch:{
                  //函数名跟定义变量名一样
                  num(newvalue,oldvalue){
                      console.log("原有数值"+oldvalue+"新数值"+newvalue);
                  }
              }
          })
      </script>
  </body>
</html>

8.过滤器

<!DOCTYPE html>
<html>
   <head>
       <meta charset="utf-8">
       <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
       <title></title>
   </head>
   <body>
       <div id="h">
           <p>{{num|fail}}</p>
       </div>
       <script type="text/javascript">
           Vue.filter('fail',function(value){
               let date=new Date
               let mouth=date.getMonth()+1
                   return 'CNN'+value+"EP"+date.getFullYear()+mouth+date.getDate()+date.getHours()+date.getMinutes()+date.getSeconds()
           })
               
           
           Vue.filter('star',function(value){
               return "CNN"+value
           })
           let z=new Vue({
               filters:{
                   tail(value){
                       return value+"EP"
                   }
               },
               el:'#h',
               data:{
                   num:210423
               }
           })
       </script>
   </body>
</html>

9.猜数字案例

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
        <title>猜数字</title>
        <!--样式代码放置于style标签里-->
        <style>
            /*
             形式1:
             #标签ID名{
                标签属性名(例如边框、背景等):属性值1 属性值2 属性值3... ;
                标签属性名(例如边框、背景等):属性值1 属性值2 属性值3... ;
                标签属性名(例如边框、背景等):属性值1 属性值2 属性值3... ;
                ....
             }
             形式2:
            标签名称{
                标签属性名(例如边框、背景等):属性值1 属性值2 属性值3... ;
                标签属性名(例如边框、背景等):属性值1 属性值2 属性值3... ;
                标签属性名(例如边框、背景等):属性值1 属性值2 属性值3... ;
                ....
            }
            还有其他形式    
             * */
            #main{
                 /*border: 1px solid black;*/
                 background-image: url(img/main.png);
                 background-size:cover;
                 height: 477px;
                 width:555px;
                 position: fixed;
                 top:51px;
                 left:498px;
            }
            #txt{
                /*border: 2px solid blue;*/
                width:360px;
                height: 62px;
                position: fixed;
                left:624px;
                top:300px;
            }
            #im{
                /*border: 2px solid red;*/
                height: 120px;
                width:110px;
                position: fixed;
                left:750px;
                top:370px;
            }
            #result{
                /*border: 2px solid green;*/
                height: 193px;
                width: 177px;
                position: fixed;
                left:1095px;
                top:214px;
            }
            input{
                width:360px;
                height:45px;
                text-align: center;
                border: none;
                outline: none;
                font-size: 20px;
            }
            #button{
                height: 120px;
                width:110px;
            }
            #big{
                height: 193px;
                width: 177px;
            }
            body{
                background-image: url(img/bg.jpg);
                background-size: cover;
                background-repeat: no-repeat;
                height: 100%;
            }
            html{
                height: 100%;
            }
        </style>

    </head>
    <body>
        <div id="app">
            <div id="main">
                <div id="txt">
                    <input type="text" id="info" v-model="num" />
                </div>
                <div id="im">
                    <img id="button" src="img/button.png" v-on:click="com" />
                </div>
            </div>
            <div id="result">
                <img id="big" v-bind:src="imgsrc" />
            </div>
        </div>
        <script type="text/javascript">
            //当页面载入就生成一个随机数
            var num = 31 * Math.random();
            //对随机数取整
            var num2 = Math.round(num);

            let z = new Vue({
                el: '#app',
                data: {
                    num: '',
                    imgsrc: 'img/noPic.png'
                    },
                methods: {
                    com() {
                        let iv = this.num;
                        if (iv.length == 0) {
                            alert('请输入数字,文本框里不能为空白');
                        } else if (isNaN(iv)) {
                            alert('你的不是数字,请重新输入');
                        } else {
                        //以用户输入数值iv和随机数num2进行比较
                        //如果用户输入的数值大于随机数,则显示图片big.png
                            if (iv > num2) {
                                this.imgsrc = "img/big.png";
                        //如果用户输入的数值小于随机数,则显示图片small.png 
                            } else if (iv < num2) {
                                this.imgsrc = "img/small.png";
                        //如果用户输入的数值等于随机数,则显示图片win.png   
                            } else {
                                this.imgsrc = "img/win.png";
                            }
                        }
                   }
                }
            })
        </script>
    </body>
</html>

10.员工信息案例

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        <div id="app">
            <table>
                <tr>
                    <th>人物编号</th>
                    <th>人物姓名</th>
                    <th>人物年龄</th>
                    <th>人物职位</th>
                </tr>
                <tr v-for="i in info">
                    <td>{{i.no}}</td>
                    <td>{{i.name}}</td>
                    <td>{{i.age}}</td>
                    <td>{{i.job}}</td>
                    <td><input type="button" name="" id="" value="删除" v-on:click="del(index)" /></td>
                </tr>
            </table>
            <input type="text" name="" id="" value="" placeholder="名字" v-model="name" /><br>
            <input type="text" name="" id="" value="" placeholder="年龄" v-model="age" /><br>
            <input type="text" name="" id="" value="" placeholder="职位" v-model="job" /><br>
            <input type="button" name="" id="" value="添加员工" v-on:click="add()" />
        </div>
        <script type="text/javascript">
            let vm = new Vue({
                el: '#app',
                data: {
                    info: [{
                        no: 1,
                        name: '曹操',
                        age: '60',
                        job: '丞相'
                    }, {
                        no: 2,
                        name: '袁绍',
                        age: '50',
                        job: '将军'
                    }],
                    name: '',
                    age: '',
                    job: ''
                },
                methods: {
                    add() {
                        let no = 0;
                        if (this.info.length == 0) {
                            no = 1;
                        } else {
                            no = this.info[this.info.length - 1].no + 1;
                        }
                        this.info.push({
                            no: no,
                            name: this.name,
                            age: this.age,
                            job: this.job
                        });
                    },
                    del(index) {
                        this.info.splice(index, 1);
                    }
                }

            });
        </script>
    </body>
</html>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • 文章参考阮一峰:MVC,MVP 和 MVVM 的图示深入响应式原理 最近工作中一直在使用Vue这一款框架作为开发工...
    大春春阅读 33,226评论 4 27
  • 一、概念介绍 Vue.js和React.js分别是目前国内和国外最火的前端框架,框架跟类库/插件不同,框架是一套完...
    刘远舟阅读 1,054评论 0 0
  • react与vue的区别 vue使用的是template模版编写。react使用的是jsx语法。状态管理:reac...
    小米和豆豆阅读 297评论 0 0
  • ️1⃣️、Vue和其他两大框架的区别 Angular 学习成本太高 React 代码可读性差 Vue 学习成本较低...
    蓝海00阅读 74,025评论 40 1,231
  • MVVM model和view层通过中间的vm连接和驱动。model层数据变化会改变视图,view改变通过事件来修...
    Super曲江龙Kimi阅读 704评论 0 1