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'},
]
})

 

原文地址:https://www.cnblogs.com/huoyz/p/14034363.html