1.Vue快速入门

1.学习目标

  • 会创建Vue实例,知道Vue的常见属性
  • 会使用Vue的生命周期的钩子函数
  • 能够使用vue常见指令
  • 能够使用vue计算属性和watch监控
  • 能够编写Vue组件
  • 能够使用axios发送异步请求获取数据

2.什么是Vue.js

Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可
以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,
当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。

2.1 Vue作者了解一下

在这里插入图片描述
百度百科

Vue官方Github

2.2 了解几个概念

2.2.1 渐进式框架:

可以选择性的使用该框架的一个或一些组件,这些组件的使用也不需要将框架全部组件都应用;而且
用了这些组件也不要求你的系统全部都使用该框架。

2.2.2 MVVM:

  • M:即Model,模型,包括数据和一些基本操作
  • V:即View,视图,页面渲染结果
  • VM:即View-Model,模型与视图间的双向操作(无需开发人员干涉)

在MVVM之前,开发人员从后端获取需要的数据模型,然后要通过DOM操作Model渲染到View中。而后当用户操作视图,我们还需要通过DOM获取View中的数据,然后同步到Model中。而MVVM中的VM要做的事情就是把DOM操作完全封装起来,开发人员不用再关心Model和View之间是如何互相影响的:

  • 只要Model发生了改变,View上自然就会表现出来。

  • 当用户修改了View,Model中的数据也会跟着改变。

把开发人员从繁琐的DOM操作中解放出来,把关注点放在如何操作Model上。
在这里插入图片描述

2.2.3 SPA:

单页Web应用(single page web application,SPA): SPA 是一种特殊的 Web 应用,是加载单个 HTML 页面并在用户与应用程序交互时动态更新该页面的。它将所有的活动局限于一个 Web 页面中,仅在该 Web 页面初始化时加载相应的 HTML 、 JavaScript 、 CSS 。一旦页面加载完成, SPA 不会因为用户的操作而进行页面的重新加载或跳转,而是利用 JavaScript 动态的变换 HTML(采用的是 div 切换显示和隐藏),从而实现UI与用户的交互。在 SPA 应用中,应用加载之后就不会再有整页刷新。相反,展示逻辑预先加载,并有赖于内容Region(区域)中的视图切换来展示内容。
在这里插入图片描述

3.快速入门

3.1 Vue安装

参照官方的提供Vue安装,这里使用本地引用的方式

3.2 入门案例

在这里插入图片描述

<div id="app">
    {{message}}
</div>
<script>
  var vm = new Vue({
    el: '#app',
    data: {
      message: 'hello vue.js'
    }
  })
</script>

在这里插入图片描述

3.3 双向绑定

<div id="app">
    <h1>
        <label for="text"></label>
        <input type="text" id="text" v-model="text">
    </h1>
    <h1>
        {{text}}
    </h1>
</div>
<script>
  var vm = new Vue({
    el: '#app',
    data: {
      text: '你好,南京艾瑞'
    }
  })
</script>

在这里插入图片描述

3.4 事件处理


<div id="app">
    <h1>{{message}}</h1>
    <button @click="reverse">反转字符串</button>
</div>
<script>
  var vm = new Vue({
    el: '#app',
    data: {
      message: 'hello world'
    },
    methods: {
      reverse: function () {
        this.message = this.message.split('').reverse().join('');
      }
    }
  })
</script>

点击按钮进行测试

4.Vue实例

每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的

var vm = new Vue({ 
	// 选项 
})

4.1 模板和元素

通过el选项将html页面和vue实例进行绑定

html模板

<div id="app">
</div>

Vue实例

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

4.2 数据

当Vue实例被创建时,它会尝试获取在data中定义的所有属性,用于视图的渲染,并且监视data中的属性变化,当data发生改变,所有相关的视图都将重新渲染,这就是“响应式“系统。
html:

<div id="app">
    <input type="text" v-model="message">
</div>

js:

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

message的变化会影响到 input 的值
input中输入的值,也会导致vm中的message发生改变

4.3 方法

Vue实例中除了可以定义data属性,也可以定义方法,并且在Vue的作用范围内使用。

<div id="app">
    <button v-on:click="_click">点我</button>
</div>
<script src="./vue.js"></script>
<script>
  var vm = new Vue({
    el: '#app',
    methods: {
      _click: function () {
        console.log('do something ...')
      }
    }
  })
</script>

在这里插入图片描述

4.4 生命钩子

每个 Vue 实例在被创建时都要经过一系列的初始化过程 :创建实例,装载模板,渲染模板等。Vue为生命周期中的每个状态都设置了钩子函数(监听函数)。每当Vue实例处于不同的生命周期时,对应的函数就会被触发调用。

不要在选项 property 或回调上使用箭头函数,比如 created: () => console.log(this.a) 或 vm.$watch(‘a’, newValue => this.myMethod())。因为箭头函数并没有 this,this 会作为变量一直向上级词法作用域查找,直至找到为止,经常导致 Uncaught TypeError: Cannot read property of undefined 或 Uncaught TypeError: this.myMethod is not a function 之类的错误。

4.4.1 生命周期

在这里插入图片描述

vm.$el :Vue 实例使用的根 DOM 元素

vm.$root :当前组件树的根 Vue 实例。如果当前实例没有父实例,此实例将会是其自己。

4.4.2 钩子函数


<div id="app">
    <input type="text" v-model="message">
</div>
<script src="./vue.js"></script>
<script>
  var vm = new Vue({
    el: '#app',
    data: {
      message: ''
    },
    beforeCreate() {
      console.log('beforeCreated')
    },
    created() {
      console.log('created')
    },
    beforeMount() {
      console.log('beforeMount')
    },
    mounted() {
      console.log('mounted')
    },
    beforeUpdate() {
      console.log('beforeUpdate')
    },
    updated() {
      console.log('updated')
    },
    beforeDestroy() {
      console.log('beforeDestroy')
    },
    destroyed() {
      console.log('destroyed')
    }
  })
</script>

5.模板语法

5.1 插值

花括号表达式

{{}}

5.2 指令

一些指令能够接收一个“参数”,在指令名称之后以冒号表示。

v-bind:

v-bind可以绑定属性和自定义属性


<div id="app">
    <a v-bind:href="url">跳转</a>
</div>
<script src="./vue.js"></script>
<script>
  new Vue({
    el: '#app',
    data: {
      url: 'https://www.baidu.com'
    }
  })
</script>

v-on:

v-on可以绑定事件属性


<div id="app">
    <span>{{number}}</span>
    <button v-on:click="number++">incr</button>
</div>
<script src="./vue.js"></script>
<script>
  new Vue({
    el: '#app',
    data: {
      number: 1
    }
  })
</script>

v-bindv-on可以简写,如v-bind:href简写成:href,而v-on:click可以简写成@click

v-if和v-show

v-ifv-show的区别v-if不会渲染标签,而v-show使用的display:none;


<div id="app">
    <button @click="isShow=!isShow">点我</button>
    <p v-if="isShow">你看见了我</p>
    <p v-show="isShow">你看见了我</p>
</div>
<script src="./vue.js"></script>
<script>
  new Vue({
    el: '#app',
    data: {
      isShow: true
    }
  })
</script>

isShow=true的时候
在这里插入图片描述isShow=false的时候
在这里插入图片描述

6.计算属性和侦听器

计算属性computed:当多个数据变化影响同一个结果的时候使用计算属性
侦听器watch:当一个数据发生变化影响多个结果的时候使用侦听器

计算属性和方法的区别:计算属性是基于它们的响应式依赖进行缓存的

下面这个例子中,商品的总价有单价和数量计算得到,这里就适合使用计算属性,如果使用侦听器则需要侦听多个属性才能正确的获取到商品的总价。


<div id="app">
    <div>
        <label for="price">单价:</label>
        <input type="text" id="price" v-model="price">
    </div>
    <div>
        <label for="count">数量:</label>
        <input type="text" id="count" v-model="count">
    </div>
    <div>
        <label for="totalPrice">总价:</label>
        <input type="text" id="totalPrice" v-model="totalPrice">
    </div>
    <div>
        <label for="total">总价:</label>
        <input type="text" id="total" v-model="total">
    </div>
</div>
</div>
<script src="./vue.js"></script>
<script>
  new Vue({
    el: '#app',
    data: {
      price: 10,
      count: 1,
      total: 10
    },
    // 计算属性
    computed: {
      // 当价格或者数量发生变化的时候,总价会重新进行计算
      totalPrice() {
        return this.price * this.count;
      }
    },
    // 侦听器
    watch: {
      price(newVal, val) {
        // 当价格发生变化时
        this.total = newVal * this.count;
      },
      count(newVal, val) {
        // 当数量发生变化时
        this.total = this.price * newVal;
      }
    }
  })
</script>

7.css&style的绑定

我们可以传给 v-bind:class 一个对象,以动态地切换 class

<div id="app">
    <div class="div" :class="{active:isActive}"></div>
</div>
<script src="./vue.js"></script>
<script>
  new Vue({
    el: '#app',
    data: {
      isActive: true
    }
  })
</script>

样式便渲染为:

<div class="div active"></div>

v-bind:style可以动态的绑定样式表:

<div id="app">
    <p :style="{'font-size':size+'px'}">字体</p>
</div>
<script src="./vue.js"></script>
<script>
  new Vue({
    el: '#app',
    data: {
      size: 30
    }
  })
</script>

8. 列表渲染

v-for,我们可以用 v-for 指令基于一个数组来渲染一个列表。v-for 指令需要使用 item in items 形式的特殊语法,其中 items 是源数据数组,而 item 则是被迭代的数组元素的别名。
为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key 属性。

<div id="app">
    <ul>
        <li v-for="(item,index) in list" :key="item.id">
            index:{{index}},name:{{item.name}},age:{{item.age}}
        </li>
    </ul>
</div>
<script src="./vue.js"></script>
<script>
  new Vue({
    el: '#app',
    data: {
      list: [
        {id: 1, name: 'jack1', age: 20},
        {id: 2, name: 'jack2', age: 20},
        {id: 3, name: 'jack3', age: 20},
      ]
    }
  })
</script>

运行结果
在这里插入图片描述

9.事件处理

可以用 v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码。

<div id="app">
    <button @click="_click">点我</button>
</div>
<script src="./vue.js"></script>
<script>
  new Vue({
    el: '#app',
    data: {},
    methods: {
      _click() {
        console.log('lick')
      }
    }
  })
</script>

10.表单输入

可以用 v-model 指令在表单 <input>、<textarea><select> 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇,但 v-model 本质上不过是语法糖。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。

10.1 文本

<div id="app">
    <input v-model="message" placeholder="edit me">
    <p>Message is: {{ message }}</p>
</div>
<script src="./vue.js"></script>
<script>
  new Vue({
    el: '#app',
    data: {
      message: ''
    }
  })
</script>

10.2 文本域

<div id="app">
    <textarea v-model="message" placeholder="add multiple lines"></textarea>
    <p>Message is: {{ message }}</p>
</div>
<script src="./vue.js"></script>
<script>
  new Vue({
    el: '#app',
    data: {
      message: ''
    }
  })
</script>

10.3 单个复选框

<div id="app">
    <input type="checkbox" id="checkbox" v-model="checked">
    <label for="checkbox">{{ checked }}</label>
</div>
<script src="./vue.js"></script>
<script>
  new Vue({
    el: '#app',
    data: {
      checked: false
    }
  })
</script>

10.4 多选复选框

<div id="app">
    <input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
    <label for="jack">Jack</label>
    <input type="checkbox" id="john" value="John" v-model="checkedNames">
    <label for="john">John</label>
    <input type="checkbox" id="mike" value="Mike" v-model="checkedNames">
    <label for="mike">Mike</label>
    <br>
    <span>Checked names: {{ checkedNames }}</span>
</div>
<script src="./vue.js"></script>
<script>
  new Vue({
    el: '#app',
    data: {
      checkedNames: []
    }
  })
</script>

10.5 单选按钮

<div id="app">
    <input type="radio" id="one" value="One" v-model="picked">
    <label for="one">One</label>
    <br>
    <input type="radio" id="two" value="Two" v-model="picked">
    <label for="two">Two</label>
    <br>
    <span>Picked: {{ picked }}</span>
</div>
<script src="./vue.js"></script>
<script>
  new Vue({
    el: '#app',
    data: {
      picked: ''
    }
  })
</script>

10.6 选择框

<div id="app">
    <select v-model="selected">
        <option disabled value="">请选择</option>
        <option>A</option>
        <option>B</option>
        <option>C</option>
    </select>
    <span>Selected: {{ selected }}</span>
</div>
<script src="./vue.js"></script>
<script>
  new Vue({
    el: '#app',
    data: {
      selected: ''
    }
  })
</script>

11.组件入门

组件是可复用的 Vue 实例,我们可以给组件自定义个名字。Vue将页面中所有的模块都可以设计成一个组件,进行重复利用。
在这里插入图片描述

11.1 基本使用

  1. 组件的template必须是单个根元素
  2. 组件中的 data必须是函数
<!--html-->
<div id="app">
    <!--引用组件-->
    <number-counter></number-counter>
    <hr>
    <number-counter></number-counter>
</div>
<script src="./vue.js"></script>
<!--js-->
<script>
  // 定义一个组件:number-counter 为组件的名称
  Vue.component('number-counter', {
    // template: 组件的模板,必须只能有一个跟元素
    template: `
        <div class="number-counter">
            <p>点击的总次数:{{number}}</p>
            <button @click="numberAdd">点击我</button>
        </div>
    `,
    // 和vue的实例有所区别,这里的data需要是函数
    data() {
      return {
        number: 0
      }
    },
    // 方法:和vue实例中的methods一样
    methods: {
      numberAdd() {
        this.number++
      }
    }
  })

  // 创建一个vue实例绑定 app
  new Vue({
    el: '#app'
  })
</script>

运行结果
在这里插入图片描述

11.2 向组件进行参数传递

可以在组件中通过props声明接收的参数,在使用组件的时候使用v-bind进行传值。
props声明的变量中,ArrayObject类型的缺省值必须使用 default函数。

<body>
<!--html-->
<div id="app">
    <!--引用组件-->
    <web-text :text="word"></web-text>
</div>
<script src="./vue.js"></script>
<!--js-->
<script>
  Vue.component('web-text', {
    template: `
        <div class="text">
            <p>{{text}}</p>
        </div>
    `,
    props: {
      text: {
        type: String,
        default: '文本内容',
        required: false
      },
      // 数组和对象必须是函数
      obj: {
        type: Object,
        default() {
          return {}
        }
      },
      arr: {
        type: Array,
        default() {
          return [];
        }
      }
    }
  })

  // 创建一个vue实例绑定 app
  new Vue({
    el: '#app',
    data: {
      word: 'hello vue'
    }
  })
</script>

11.3 自定义事件(子组件调用父组件的方法)

自定义事件是通过 this.$emit('myEvent'),有子组件调用父组件的函数来实现。
代码说明:

  1. web-text组件上绑定一个 my-event事件,当事件触发后将调用_myEvent函数;
  2. 当子组件中的word值发生该改变的时候,通过this.$emit('my-event', this.word)触发事件,并传递参数到父组件。
<!--html-->
<div id="app">
    <!--引用组件-->
    <web-text v-on:my-event="_myEvent"></web-text>
</div>
<script src="./vue.js"></script>
<!--js-->
<script>
  Vue.component('web-text', {
    template: `
        <div>
            <input type="text" v-model="word">
        </div>
    `,
    data() {
      return {
        word: ''
      }
    },
    watch: {
      word: function () {
        this.$emit('my-event', this.word)
      }
    }
  })

  // 创建一个vue实例绑定 app
  new Vue({
    el: '#app',
    methods: {
      _myEvent(word) {
        console.log("接收到的参数:" + word)
      }
    }
  })
</script>
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值