zoukankan      html  css  js  c++  java
  • Vue的基本使用

    Vue的基本使用

    一. Vue.js之细节分析

    1.实例参数分析

    • el:元素的挂载位置(值可以是CSS选择器或者DOM元素)

    • data 模型数据(值是一个对象)

    • methods:{} 方法区: 里面放的函数

    • computed:{}计算属性区:,计算属性定义在computed里面

    • watch:{} 监听器: 数据变化时执行异步或者开销较大的操作,数据一旦发生变化就通知监听器所绑定的方法

    • mounted: function(){}钩子函数: 该生命周期钩子函数被触发的时候,模版已经可以使用,

      一般此事用于获取后台数据,然后把数据填充到模版

    • components:{} 局部组件 ,放到components:{}中的组建只有本类中可以使用

    2.插值表达式用法

    • 将数据填充到HTML标签中

    • 插值表达式指出基本的计算操作

    • 语法: {{}}

      <body>
          <div id="app">
      <!--         插值表达式 ,页面显示data里面msg里的值Hello Vue-->
      <!--         插值表达式还支持下面的一些基本计算和数据拼接-->
              <div>{{msg}}</div>
              <div>{{1+2}}</div>
              <div>{{msg+'----'+123}}</div>
          </div>
          <script src="js/vue.js"></script>
          <script>
             var vm=  new Vue({
                   el:'#app',
                   data:{
                       msg:'Hello Vue'
                  }
              })
          </script>
      </body>

    3.数组相关API

    3.1 变异方法(修改原有数据)
    • Push() 在数组尾部添加新元素。(尾部新增)

    • Pop() 取出数组尾部元素。(尾部取出)

    • Shift() 取出数组头部元素。(头部取出)

    • Unshift() 在数组头部添加新元素。(头部新增)

    • Splice() 向数组中添加,删除 元素,然后返回被删除的元素

    • Sort() 对数组的元素进行排序. 升序

    • Reverse() 对数组的元素进行排序. 降序

    3.2 替换数组(生成新的数组)
    • Filter(). 通过检查指定数组中符合条件的所有元素

    • Concat() 连接两个或更多的数组,并返回结果

    • Slice() 从已有的数组中返回选定的元素

    • Some(). 用于检测数组中的元素是否满足指定条件,如果满足,返回true,剩下的不会执行

    3.3 修改响应式数据
    • Vue.set(vm.items,indexOfltem,newValue)

    • vm.$set(vm.items,indexOfltem,newValue) 和前面的小效果一样,只是写法不同

      1⃣️ 参数一表示要处理的数组名称

      2⃣️ 参数二表示要处理的数组索引

      3⃣️ 参数三表示要处理的数组的值

    <body>
    <div id="app">
       <ul>
           <li v-for="item in list">{{item}}</li>
       </ul>
    </div>
    <script src="../../js/vue.js"></script>
    <script>

       var vm = new Vue({
           el: '#app',
           data: {
               list:["apple","orange","banana"]
          },
      })
       //把数组中第二个数据改成茄子
       vm.$set(vm.list,1,"茄子")
    </script>
    </body>

     

    二. Vue模版语法

    前段渲染方式

    • 插值表达式

    • 指令

    • 事件绑定

    • 属性绑定

    • 样式绑定

    • 分支循环结构

       

    2.指令

    2.1 数据绑定指令
    • v-text 填充纯文本

      1⃣️ 相比插值表达式更加简洁

    • V-html 填充HTML片段

      1⃣️ 存在安全问题

      2⃣️ 本网站内部数据可以使用,来自第三方的数据不可以用

    • v-pre 填充原始信息

      1⃣️ 显示原始信息,跳过编译过程

           <div>v-html="msg"</div>  <!--和插值表达式一样页面显示的是data里msg的值-->
              <div>v-text='msg'</div><!--和插值表达式一样页面显示的是data里msg的值,不安全!-->
              <div>v-pre="msg"</div><!--页面显示的是msg,而不是msg的值-->
    2.2 数据响应式
    • 如何理解响应式

      1⃣️ html5中的响应式(屏幕尺寸的变化导致样式的变化)

      2⃣️ 数据的响应式(数据的变化导致页面内容的变化)

    • 什么是数据绑定

      1⃣️ 数据绑定: 将数据填充到标签中

      2⃣️ vue是双向绑定,用v-model绑定可以实现

    • v-once只编译一次

      1⃣️ 实现内容之后不再具有响应式功能

    2.3自定义指令
    • 自定义指令用法

      <input type="text" v-focus>

    3.事件绑定

    3.1vue如何处理事件?
    • v-on指令用法

      <input type=''button" v-on:click=''''/>

    • V-on. 缩写: @

      <input type=''button" @click=''''/>

    3.2事件函数的调用方式
    • 直接绑定函数名称,无参数,默认有一个事件对象

      <button @click="say">Hello</button>

    • 调用函数(有参数)

      <button @click="say(123,333,$event)">Hello</button>

      <body>
          <div id="app">
              <div>{{num}}</div>
      <!--         直接调用,默认会有事件函数-->
             <button @click="handle">点击1</button>
      <!--         可以传参数,$event事件函数要手动添加,必须在最后一个-->
              <button @click="handle(123,456,$event)">点击2</button>

          </div>
          <script src="js/vue.js"></script>
          <script>
             var vm=  new Vue({
                   el:'#app',
                   data:{
                       num:0,
                  },
                 methods:{
                     /*
                      事件绑定-参数传递
                      1。如果事件直接绑定函数名称,那么默认会传递事件对象作为事件函数的第一个参数
                      *2。如果时间绑定函数调用,(传递参数),那么事件对象必须在最后一个
                      3。$event事件函数是固定写法
                      */
                       handle:function (p,k,event) {
                          //这里的参数就是获取到的参数123,和456
                           console.log(p,k)
                           //$event是事件对象,
                           //$event.target则指的是事件触发的目标,即哪一个元素触发了事件,这将直接获取该dom元素
                           console.log(event.target)

                           // 这里的this是Vue的实例对象
                         this.num++;
                      }
                }
              })
          </script>
      </body>

       

    3.3事件修饰符
    • .stop阻止冒泡

    • .prevent阻止默认行为

    3.4 按键修饰符
    • .enter 回车键

      <input v-on :keyup.enter="submit">

    • .delete 删除键

      <input v-on :keyup.delete="handle">

    3.5 简易得计算机案例
    • 实现逻辑

    • 1.先绑定input a,input b. ,input 结果

    • 2.data里面定义a、b、结果三个熟悉

    • 然后点击按钮触发事件,在方法里写相加的逻辑

    <body>
    <div id="app">
       <h1>简易计算机</h1>
       <div>
           <span>数值A:</span>
           <span><!--绑定a-->
                     <input type="text" v-model="a">
                 </span>
       </div>
       <div>
           <span>数值B:</span>
           <span><!--绑定b-->
                     <input type="text" v-model="b">
                 </span>
       </div>
       <div>
           <button @click="handel">计算</button>
       </div>
       <div>
           <span>计算结果</span>
           <!--绑定result-->
           <span v-text="result"></span>
       </div>
    </div>
    <script src="js/vue.js"></script>
    <script >
       var vm=  new Vue({
           el:'#app',
           data:{
              a:'',
               b:'',
               result:''
          },
           methods:{
               handel:function () {
                    //实现计算逻辑
                    // parseInt(this.a)转换成int ,不转换的话是就会拼接
                   this.result= parseInt(this.a)+ parseInt(this.b);
              }

          }
      })
    </script>
    </body>

    4.属性绑定

    4.1 vue如何动态处理属性?
    • v-bind指令用法

      <a v-bind:href="url"></a>

    • 缩写形式

      <a :href="url"></a>

    <body>
    <div id="app">
    <!--   v-bind是属性绑定 ,简写成 :-->
    <!--   现在就是绑定了data里面的url的地址-->
       <a :href="url">跳转</a>
       <button @click="handle">切换</button>
    </div>
    <script src="js/vue.js"></script>
    <script >
       var vm=  new Vue({
           el:'#app',
           data:{
              url:'http://www.baidu.com'
          },
           methods:{
               handle:function () {
                  //修改URL的地址
                   this.url='http://itcast.cn';
              }

          }
      })
    </script>
    </body>
    4.2 v-model的底层实现原理分析
    • v-model其实就是v-bind和v-on组合起来的

       <input v-bind:value="msg" v-on:input="msg=$event.target.value">

    5.样式绑定

    5.1 class样式处理
    • 对象语法

      <div v-bind:class="{active: isActive}"></div>
    • 数组语法

      <div v-bind:class="{a,b}"></div>

       

    5.2 Style样式处理
    • 对象语法

      <body>
      <div id="app">
      <!--       //内联样式Style-->
            <div v-bind:style="{border:borderStyle1,widthStyle,height:heightStyle}"></div>
      <!--       //内联绑定对象-->
             <div v-bind:style="objStyles"></div>

             <button v-on:click="handle">切换</button>
      </div>
      <script src="js/vue.js"></script>
      <script >
         var vm=  new Vue({
             el:'#app',
             data:{
               borderStyle1:"1px solid blue",
                 widthStyle:"100px",
                 heightStyle:"200px",

                 objStyles:{  /*对象*/
                   border:"1px solid green",
                     "200px",
                     height:"100px"
                }
            },
             methods:{
                 handle:function () {
                     //点击事件之后可以把高度切换成100px
                      this.heightStyle='100px';
                      //点击事件之后可以把对象里面的宽度切换成30px
                      this.objStyles.width="30px";
                }
            }
        })
      </script>
      </body>

       

    6.分支循环结构

    6.1 分支结构
    • v-if

    • v-else

    • V-else-if

    • V-show

       

    6.2 循环结构
    • v-for遍历数组

      <li v-for="item in list">{{item}}</li>

       

    三. Vue常用特性

    常用特性概览

    • 表单操作

    • 计算属性

    • 过滤器

    • 监听器

    • 生命周期

       

    1.表单操作

    1.1基于Vue的表单操作
    • Input 单行文本

    • textarea 多行文本

    • select 下拉多选

    • Radio 单选框

    • Checkbox 多选框

    <body>
    <div id="app">
       <form>
           <!--       input单行表单-->
           <div>
               <span>姓名:</span>
               <span>
    <!--               v-model默认是双向绑定-->
                   <input type="text" v-model="name1">
               </span>
           </div>
           <!--       单选按钮-->
           <div>
               <span>性别</span>
               <span>
                 <!--       v-model绑定-->
               <input type="radio" id="male" value="1" v-model="gender">
               <label for="male">男</label>
               <input type="radio" id="female" value="2" v-model="gender">
               <label for="female"></label>
               </span>
           </div>
           <!--       多选按钮 -->
           <div>
               <span>爱好</span>
               <input type="checkbox" id="ball" value="1" v-model="aihao">
               <label for="ball">篮球</label>
               <input type="checkbox" id="pai" value="2" v-model="aihao">
               <label for="pai">排球</label>
               <input type="checkbox" id="pingpang" value="3" v-model="aihao">
               <label for="pingpang">乒乓球</label>
           </div>
           <!--     下拉框   -->
           <div>
               <span>职业</span>
               <select v-model="zhiye">
                   <option value="0">请选择职业</option>
                   <option value="1">教师</option>
                   <option value="2">程序员</option>
                   <option value="3">电焊工</option>
               </select>
           </div>
           <!--       多行文本框-->
           <div>
               <span>个人简介</span>
               <textarea name="" id="" cols="30" rows="10">

               </textarea>
           </div>
           <div>
               <!--           .prevent阻止默认行为-->
               <input type="submit" @click.prevent="handel">
           </div>
       </form>
    </div>
    <script src="../js/vue.js"></script>
    <script>

       var vm = new Vue({
           el: '#app',
           data: {
               name1: "ddd",
               gender: 2,
               aihao: [2, 3],
               zhiye: 3
          },
           methods: {
               handel: function () {
                   //   选到女的性别上
                   alert(this.gender)
              },

          }

      })
    </script>
    </body>
    1.2 表单域修饰符
    • Number:转化为数值

    • Trim:去掉开始和结尾的空格

    • Lazy:将input事件切换为chang事件

    2.计算属性

    2.1计算属性是基于data里的数据来计算的, 在computed:{}里面通过函数的方式定义计算逻辑
    <body>
    <div id="app">
       <div>
          {{reverseString}}
       </div>
    </div>
    <script src="../js/vue.js"></script>
    <script>

       var vm = new Vue({
           el: '#app',
           data: {
               msg:'hello'
          },
           methods: {

          },
           //计算属性,计算属性定义在computed里面
           //计算属性存在缓存,方法没有缓存!
           computed:{
               reverseString:function () {
                   //反转字符串
                   return this.msg.split('').reverse('');
              }

          }

      })
    </script>
    </body>
    2.2 计算属性与方法的区别
    • 计算属性是基于它们的依赖进行缓存的

    • 方法不存在缓存

    3.侦听器

    3.1 监听器的使用场景
    • 数据变化时执行异步或者开销较大的操作,数据一旦发生变化就通知监听器所绑定的方法

      //监听器 ,定义在 watch:{}里面
          watch:{
              //监听名,如果名发生变化,把名的变化赋值给姓名
              ming:function (value) {
            this.xingMing= this.ming+" "+value;
              },
              //监听姓,如果发生变化赋值给姓名
              xing:function (value) {
                  this.xingMing=this.xing+" "+value;

              }
          }

    4.过滤器

    4.1 过滤器是什么
    • 格式化数据,比如将字符串格式化为首字母大写,将日期格式化为制定的格式等

    4.2 自定义过滤器
    <body>
    <div id="app">
       <input type="text" v-model="msg">
    <!--   过滤器用法,| 后面跟上过滤器的名字-->
       <div>{{msg | upper}}</div>
    </div>
    <script src="../js/vue.js"></script>
    <script>
       /**
        * 自定义过滤器
        * Vue.filter调用过滤器
        */
       Vue.filter("upper",function (val) {
           /**
            * 过滤器> 需求:将首字母变成大写
            * 思路:
            * 1。原生js的 .charAt(0)获取到第一个字母
            * 2. .toUpperCase()方法把字母变成大写
            * 3。 。slice(1)从第二个字母截取到最后
            */
           return val.charAt(0).toUpperCase() + val.slice(1);
      })
       var vm = new Vue({
           el: '#app',
           data: {
              msg:"",
          },
           methods: {
          }
      })
    </script>
    </body>

    4.3 过滤器的使用

    <div>{{msg | upper}}</div>
    <div>{{msg | upper | lower}}</div>
    <civ v-bind:id='id | formatId'> </div>

    5.生命周期

    5.1 vue的生命周期是什么
    • vue每个组件都是独立的,每个组件都有一个属于它的生命周期,从一个组件创建、数据初始化、挂载、更新、销毁,这就是一个组件所谓的生命周期

    四. 组件化开发

    目录

    • 组件注册

    • Vue调试工具用法

    • 组件间数据交互

    • 组件插槽

    • 基于组件的案例

    1.组件注册

    1.1 全局组件注册语法

    Vue.component(组件名称,{

    data: 组件数据,

    Template: 组件模版内容

    })

    <body>
    <div id="app">
    <!--   使用组件-->
       <button-counter></button-counter>
    </div>
    <script src="../js/vue.js"></script>
    <script>
    <!--   全局注册组件-->
        Vue.component("button-counter",{
            data:function () {
                return{
                    count :0
                }
            },
            template:'<button @click="count++">点击了{{count}}次</button>'
        })
       var vm = new Vue({
           el: '#app',
           data: {
          },
      })

    </script>
    </body>
    1.2 组件用法
    <div id="app">
    <!--   使用组件 <button-counter>是全局注册的组件名 -->
       <button-counter></button-counter>
    </div>
    1.3 局部组件注册
    • 局部组件就是把组件放到 components:{}中

     var vm = new Vue({
           el: '#app',
           data: {
          },
           components: { //局部组件
             //Helloword是定义好的组件引入进来,然后赋值给左边
              'hello-word':Helloword,
          }
      })

    2.组件间数据交互

    2.1 父组件向子组件传值
    • 父组件通过属性将值传递给子组件,子组件通过props:[] 来接收

      <body>
      <div id="app">
         <!--   父组件通过属性将值传递给子组件,子组件通过props来接收-->
         <menu-item title="来自父组件的值"></menu-item>
      </div>
      <script src="../js/vue.js"></script>
      <script>
         /**
          * 父组件向子组件传值
          */
         Vue.component('menu-item', {
             props: ['title',],/*props用来接受父组件的值,props后面跟着数组*/
             data: function () {
                 return {
                     msg: '子组建本身的数据'
                }
            },
             template: '<table>{{msg+"----"+title}}</table>'
        })
         var vm = new Vue({
             el: '#app',
             data: {
                 pmsg: '父组件中的内容'
            }
        })
      </script>
      </body>
    2.2 props熟悉名规则
    • 在props中使用驼峰形式,模版中需要使用短横线的形式 (最好都用短横线比较好)

    2.3 子组件向父组件传值

    在子组件中,利用  $emit  触发 父组件传递过来的方法的时候,可以将子组件的数据当做参数传递给父组件

    父组件:father.vue

    <template>
      <div>
        <h1>父组件</h1>
        <router-view @show="showFather"></router-view>
      </div>
    </template>
     
    <script>
    export default {
      data () {
        return {
          fromSon1: '',
          fromSon2: ''
        };
      },
      methods: {
        showFather (a, b) {
          this.fromSon1 = a;
          this.fromSon2 = b;
          console.log('触发了父组件的方法' + '======' + a + '======' + b);
        }
      }
    }
    </script> 

    子组件:son.vue

    <template>
      <div>
        <h1>子组件</h1>
        <Button type="primary" @click="sonClick">触发父组件方法</Button>
      </div>
    </template>
     
    <script>
    export default {
      props: ['fData', 'fMessage'],
      data () {
        return {
          sonMessage: '子组件数据sonMessage',
          sonData: '子组件数据sonData'
        };
      },
      methods: {
        sonClick () {
          this.$emit('show', this.sonMessage, this.sonData);
        }
      }
    }
    </script> 

    3.组件插槽

    • <slot></slot>是插槽的固定写法 可以在定义好的组件名中间写内容

    <body>
    <div id="app">
    <!--   插槽是在两个<alert-box>中间写内容-->
       <alert-box>有一个错误</alert-box>
    </div>
    <script src="../js/vue.js"></script>
    <script>
       /*
      组件插槽
      <slot></slot>是插槽的固定写法 可以在<alert-box></alert-box>中间写内容
        */
       Vue.component('alert-box',{
           template:`<div>
                 <strong>ERROR</strong>
                 <slot></slot>
               </div>`
          }

      )
       var vm = new Vue({
           el: '#app',
           data: {
          },
      })
    </script>
    </body>

     

    五. 前后端交互模式

    目录

    • URL地址格式

    • Promise用法

    • 接口调用-axios用法

    • 接口调用-async/await用法

    1. URL地址格式

    1.1 传统形式的URL
    • 格式: Schema: //host:port/path?query#fragment

      1⃣️ schema: 协议。例如http、https、ftp等

      2⃣️ host: 域名或者IP地址

      3⃣️ port: 端口, http默认端口80,(可以省略)

      4⃣️ path: 路径, 例如/abc/a/c

      5⃣️ query: 查询参数,

      6⃣️ fragment: 锚点(Hash),用于定位页面的某个位置

    1.2 Restful形式的URL
    • HTTP请求方式

      1⃣️ GET 查询

      2⃣️ POST 添加

      3⃣️ PUT 修改

      4⃣️ DELETE 删除

    2. Promise

    2.1 Promise基本用法
    • 实例化Promise对象,构造函数中传递函数,该函数处于异步任务

    • resolvereject两个参数用于处理成功和失败两种情况,并通过p.then获取处理结果

    3.axios

    3.1.GET传递参数 DELETE与之类似
    • 通过URL方式传递参

    axios.get('/adata?id=123')
    .then(ret=>){
    console.log(ret.data)
    })
    • 通过Restful方式传参

    axios.get('/adata/id/123')
    .then(ret=>){
    console.log(ret.data)
    })
    • 通过params方式传参

    axios.get('/adata',{
        params:{
        id:123,
        name:'张三'
        }
    }).then(ret =>{
       console.log(ret.data)
    })

    3.2.POST传递参数, put与之类似
    • 通过选项传递参数(默认传递的是json格式的数据)

    axios.post('/adata',{
    uname:'tom',
    pwd:123
    }).then(ret =>{
    console.log(ret.data)
    })
    • 通过URLSearchParams传递参数

     //先实例化URLSearchParams对象,然后把参数append进去,
    //然后对象作为参数传递
    var params= new URLSearchParams();
    params.append('uname','张三')
    params.append('pwd','111')
    axios.post('/adata',params).then(ret =>{
    console.log(ret.data)
    })
    3.3 axiom 的全局配置
    • axios.defaults.timeout=3000; //超时时间

    • axios.defaults.baseURL=' http://localhost:3000/aaa'. //默认地址

    • axios.defaults.headers[ 'muytoken' ] ='aqafgsadfgadfgadfg'. //设置请求头

    4. async/await用法

    4.1 async/await的基本用法
    • async/await是Es7引入的新语法,可以更加方便的进行异步操作

    • async关键字用在函数上(async函数的返回值是Promise实例对象)

    • await关键字用于async函数当中(await可以得到异步的结果)

    /**
    1. 先在函数的前面加上async
    2. 然后再在函数里面用await得到异步的结果 ,await后面跟一个Promise实例对象
    */
    async function queryData(id){
    const ret = await axios.get('/data');
       console.log(ret.data)   //就可以直接得到data对象
     
    }

    六. 路由

    目录

    • vue-router 的基本使用

    • vue-router 嵌套路由

    • vue-router 动态路由匹配

    • vue-router 命名路由

    • vue-router 编程式导航

    1. 路由的基本使用

    1.1 配置路由规则并创建路由实例
    var router= new VerRouter({
    //routes是路由规则数组
    routes:[
    //每个路由规则都是一个配置对象,其中至少包含path和 component 两个属性
    //path 表示当前路由规则匹配的 hash 地址
    //component 表示当前路由规则对应要展示的组件
    { path:'/user',component: User},
    {path: '/register', component :Register}
    ]
    })
    1.2 路由重定向
    • redirect: 是重定向的地址

    var router= new VerRouter({
    //routes是路由规则数组
    routes:[
    //其中,path 表示需要被重定向的原地址,redirect 表示将要被重定向到的新地址
    { path:'/',redirect:'login'},
    ]
    })

     

  • 相关阅读:
    轻量级MVVM框架Stylet介绍:(13) ValidatingModelBase
    轻量级MVVM框架Stylet介绍:(9)PropertyChangedBase
    轻量级MVVM框架Stylet介绍:(8)事件聚合器
    轻量级MVVM框架Stylet介绍:(12) BindableCollection
    轻量级MVVM框架Stylet介绍:(14) StyletIoC
    轻量级MVVM框架Stylet介绍:(5) Actions
    轻量级MVVM框架Stylet介绍:(10) Execute:调度到UI线程
    轻量级MVVM框架Stylet介绍:(7) MessageBox
    轻量级MVVM框架Stylet介绍:(6) WindowManager
    tushare的mysql的sql结构文件
  • 原文地址:https://www.cnblogs.com/huoyz/p/14034363.html
Copyright © 2011-2022 走看看