vue学习第一天笔记

VUE

  • 下载和安装
    • vue官网
    • npm下载vue模块:npm install vue
    • 下载完后使用里面的vue.js文件即可;
  • vue.js 是MVVM框架
    • 数据可以影响视图,视图也可以影响数据;
  • 体验vue.js
    • 模板渲染;在视图中用{{msg}}来引入msg的属性值到页面中,可以通过app.msg="xx"重新赋值,此时页面也会实时更新;
     <!DOCTYPE html>
     <html lang="en">
     <head>
         <meta charset="UTF-8">
         <title>声明式渲染</title>
     </head>
     <body>
     <div id="app">
         {{msg}}
     </div>
     <script src="js/vue.js"></script>
     <script>
         var app=new Vue({
             el:"#app",
             data:{
                 msg:"hello guo"
             }
         })
     </script>
     </body>
     </html>
    
    • 动态操作DOM属性:通过定义数据,来实时改变DOM中标签元素的属性值;
      • 使用:v-bind:属性名="动态数据"
      • 在webstorm中使用v-bind会报红,所以可以删除它只写冒号后面的代码:如::属性名="动态数据"
    • 条件判断:通过判断数据的布尔值,进而来控制元素的显示和隐藏;
      • 使用:v-if:"动态数据"
      • 如:v-if:"bok";指的是判断bok的值,如果为true,则显示该元素,为false,则不显示该元素;
    • 循环:数据和对象的遍历
      • 使用:v-for="(item,index) in 数据数组名或对象名"
      • 其中:
        • 1)如果遍历数组:item获取的是数组中的每个元素,index获取的数组中元素的索引值;
        • 2)如果遍历对象:item获取的是对象中的属性值,index获取的对象中的属性名;
    • 事件:
      • 使用:v-on:事件名="数据"
      • 在webstorm中会报红,所以需要使用@事件名="数据";
      • 如果赋值给事件为函数,函数在应用中必须写在methods中,数据写在data中;
       <!DOCTYPE html>
       <html lang="en">
       <head>
           <meta charset="UTF-8">
           <title>事件绑定</title>
       </head>
       <body>
       <div id="app">
           <p>{{msg}}</p>
           <button type="button" @click="reverseMsg">顺序</button>
       </div>
       <script src="js/vue.js"></script>
       <script>
           var app=new Vue({
               el:"#app",
               data:{
                   msg:"这是事件绑定的数据"
               },
               //函数写在methods中
               methods:{
                   reverseMsg:function () {
                       this.msg=this.msg.split("").reverse().join("");
                   }
               }
           })
       </script>
       </body>
       </html>
      
    • 双向数据绑定
      • 表单数据和应用数据的联系,通过v-model来设置表单标签,当表单中输入内容时,可以改变应用中的数据;
      • 如果一个标签想要只赋值一次应用数据,则可以使用v-once,这样只会赋值一次数据,数据变化后,它不会再改变;
       <!DOCTYPE html>
       <html lang="en">
       <head>
           <meta charset="UTF-8">
           <title>双向绑定数据</title>
       </head>
       <body>
       <div id="app">
           <h1>{{msg}}</h1>
           <!--"v-model"实现表单跟应用的数据变化,通过表单值来改变应用数据-->
           <input type="text" v-model="msg"/>
           <!--"v-once"指的是赋值一次数据-->
           <p v-once>{{msg}}</p>
       </div>
       <script src="js/vue.js"></script>
       <script>
           var app=new Vue({
               el:"#app",
               data:{
                   msg:"这是双向绑定数据"
               }
           })
       </script>
       </body>
       </html>
      
    • 自定义组件
      • 注册组件:通过Vue.component("timet",{template:"<li>xxxxx</li>" });
        • 注册组件名和template模板
        • 使用时,直接使用标签即可;
      • 父级组件传递数据给子级组件;
        • 父级组件设置自定义属性,来向子级传递数据,设置自定义属性用v-bind:属性名="数据值";
        • 子级组件在Vue.component中通过props来获取属性名,即props:["属性名"],则属性名就代表传递来的数据值;
       <!DOCTYPE html>
       <html lang="en">
       <head>
           <meta charset="UTF-8">
           <title>自定义组件</title>
       </head>
       <body>
       <div id="app">
           <ol>
               <timet v-for="item in getData" v-bind:todo="item" v-bind:key="item.id"></timet>
           </ol>
       </div>
       <script src="js/vue.js"></script>
       <script>
           //注册组件
           Vue.component("timet",{
               props:["todo"],
               template:"<li>{{todo.msg}}</li>"
           });
           var app=new Vue({
               el:"#app",
               data:{
                   getData:[
                       {id:0,msg:"这是蔬菜1"},
                       {id:1,msg:"这是蔬菜2"},
                       {id:2,msg:"这是蔬菜3"},
                       {id:3,msg:"这是蔬菜4"}
                   ]
               }
           })
       </script>
       </body>
       </html>
      
    • 表达式和v-html
      • 表达式:{{}}
        • 可以进行设置数据值,如{{msg}}
        • 可以进行赋值,如{{msg=200}},此时应用中的msg数据也会变化;
        • 可以使用三目(三元表达式),如{{bok?333:444}},即条件判断成立与否,得到的值不同;
      • v-html:设置在标签上,代表将数据值,以标签的形式插入到该标签中;
       <!DOCTYPE html>
       <html lang="en">
       <head>
           <meta charset="UTF-8">
           <title>表达式</title>
       </head>
       <body>
       <div id="app">
           <!--{{}}表达式,支持 msg 赋值 三目(三元表达式)-->
           {{msg}} {{msg=444}} {{bok?666:777}}
           <!--"v-html":将变量值,以标签的形式插入到p中-->
           <p v-html="glt"></p>
           <!--表达式,将变量值,以内容值的形式插入到p中-->
           <p>{{glt}}</p>
       </div>
       <script src="js/vue.js"></script>
       <script>
           var app=new Vue({
               el:"#app",
               data:{
                   msg:"333",
                   bok:true,
                   glt:"<li>这是内容</li>"
               }
           })
       </script>
       </body>
       </html>
      
    • v-if和v-show
      • v-if:判断数据值的布尔值,如果为true,则该元素显示,否则,删除该标签节点;相当于removeChild();
      • v-show:判断数据值的布尔值,如果为true,则该元素显示,否则,该元素隐藏,不会删除该标签节点;相当于display:none;
      • 如果频繁切换显示或隐藏,就用v-show;判断数据是否存在,就用v-if;

购物车实例

  • 思路:
    • 下载bootstrap模块,构建静态页面,命令:npm install bootstrap@3;规定版本,否则,一些css样式不能使用;
    • 引入bootstrap.css文件;
    • 构建静态页面,在信息区域,通过在应用区域data内设置ary数组数据,在页面中通过v-for来遍历ary数据,拿到item数据每一项元素,和index,索引值;
    • 删除功能:通过点击表格中的删除按钮,来触发deleteOne函数,函数中删除对应的ary中的数据,进而页面中删除;
      • 重要:通过v-for遍历数组时,拿到每个数组元素的索引index,通过点击事件设置时,将index作为参数传给deleteOne函数,函数内拿到索引值,通过splice就可以删除此项;
    • 删除全部功能:点击删除全部按钮,触发deleteAll函数,将ary赋值为空数组;
      • 为了实现,当删除全部后,让删除全部一行也删除或隐藏,可以在tr上设置v-if或v-show,判断ary的长度是否为0,若为0,则赋值为true,进而该行就隐藏或删除;
    • 增加功能:点击按钮触发addOne函数,函数内将数据插入到ary中;
      • 重点:在输入内容的表单上,设置v-model="xxx",这样就实现了表单输入数据和应用数据的同步,需注意的是,在应用data中一定要设置shopname和shopprice为空,否则,会报错;
      • 当输入内容后,shopname和shopprice的值就会实时更新,输入完毕后,点击按钮,然后将两个值以对象的形式,插入到数组中;数据增加后,将两个值赋值为空;即重置;
      • 筛选:
        • 当点击按钮后,必须判断shopname和shopprice值是否均存在,如果不存在,则不能提交;
        • 存在的情况下,可以对输入的shopname值进行判断,然后进行一系列的操作;
    • 重置功能:点击重置按钮,然后将shopname和shopprice值赋值为空;
  • 代码:
 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>购物车实例</title>
     <link rel="stylesheet" href="css/bootstrap.css">
     <style>
         .table-bordered{
             border: 2px solid green;
         }
         .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, .table-bordered > tfoot > tr > th, .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td{
             border: 1px solid red;
             vertical-align: middle;
         }
         .btn-danger{
             border-width: 0;
             padding: 5px 15px;
         }
     </style>
 </head>
 <body>
 <div class="container" id="app" style="margin-bottom: 100px;">
     <div class="row">
         <div class="col-md-12">
             <table class="table table-bordered" style="font-size: 20px;">
                 <caption class="text-danger" style="font-size:30px;font-weight: 700">购物车</caption>
                 <tr>
                     <th class="text-center">商品名称</th>
                     <th class="text-center">商品价格</th>
                     <th class="text-center">操作</th>
                 </tr>
                 <tr v-for="(item,index) in ary">
                     <td class="text-center">{{item.name}}</td>
                     <td class="text-center">{{item.price}}</td>
                     <td class="text-center"><button type="button" class="btn-danger" @click="deleteOne(index)">删除</button></td>
                 </tr>
                 <tr v-if="ary.length?true:false">
                     <td colspan="3" class="text-right"><button type="button" class="btn-danger" @click="deleteAll">删除全部</button></td>
                 </tr>
             </table>
         </div>
         <div class="col-md-12">
             <form style="font-size: 20px;">
                 <div class="form-group">
                     <label for="shopname">商品名称</label>
                     <input type="text" class="form-control" id="shopname" v-model="shopname">
                 </div>
                 <div class="form-group">
                     <label for="shopprice">商品价格</label>
                     <input type="number" class="form-control" id="shopprice" v-model="shopprice">
                 </div>
                 <div class="from-group">
                     <input type="button" id="dd" class="btn btn-primary" @click="addOne" value="添加">
                     <input type="button" id="dd1" class="btn btn-warning" @click="resetData" value="重置">
                 </div>
             </form>
         </div>
     </div>
 </div>
 <script src="js/vue.js"></script>
 <script>
     var app=new Vue({
         el:"#app",
         data:{
             shopname:"",
             shopprice:"",
             ary:[
                 {name:"小米6",price:1999},
                 {name:"小米7",price:2999},
                 {name:"小米8",price:3999},
                 {name:"小米9",price:4999}
             ]
         },
         methods:{
             deleteOne:function (index) {
                 console.log(this)
                 this.ary.splice(index,1);
             },
             deleteAll:function () {
                 this.ary=[];
             },
             addOne:function () {
                 //表单中输入内容不为空时,才能添加;
                 if(this.shopname && this.shopprice){
                     //如果商品名称重复,则改变其价格,阻止程序执行;
                     for(var i=0; i<this.ary.length; i++){
                         if(this.ary[i].name===this.shopname){
                             this.ary[i].price=this.shopprice;
                             this.shopname="";
                             this.shopprice="";
                             return;
                         }
                     }
                     //当商品名称不重复时,才能改变价格
                     this.ary.push({
                         name:this.shopname,
                         price:this.shopprice
                     });
                     //添加后,清空表单中内容;
                     this.shopname="";
                     this.shopprice="";
                 }else{
                     alert("内容不能为空,请输入内容")
                 }
             },
             resetData:function () {
                 this.shopname="";
                 this.shopprice="";
             }
         }
     })
 </script>
 </body>
 </html>

简书知识

vue学习大纲1-基础,事件和数据交互

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

推荐阅读更多精彩内容

  • vue概述 在官方文档中,有一句话对Vue的定位说的很明确:Vue.js 的核心是一个允许采用简洁的模板语法来声明...
    li4065阅读 7,217评论 0 25
  • 1.安装 可以简单地在页面引入Vue.js作为独立版本,Vue即被注册为全局变量,可以在页面使用了。 如果希望搭建...
    Awey阅读 11,024评论 4 129
  • # 传智播客vue 学习## 1. 什么是 Vue.js* Vue 开发手机 APP 需要借助于 Weex* Vu...
    再见天才阅读 3,540评论 0 6
  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 2,210评论 0 6
  • 一:搭建环境 1、安装node(去node官网吧) 2、npm安装 vue-cli(npm i vue-cli -...
    nginx_9c96阅读 164评论 0 0