【前端】vue学习2:MVVM、Vue基础、双向绑定、组件、Vue生命周期、Axios

第一个Vue程序

Vue

Vue (读音/vju/, 类似于view)是一套用于构建用户界面的渐进式框架,发布于2014年2月。与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层,不仅易于上手,还便于与第三方库(如: vue-router, vue-resource, vuex)或既有项目整合。


MVVM模式的实现者

  • Model:模型层,在这里表示JavaScript对象
  • View:视图层,在这里表示DOM (HTML操作的元素)
  • ViewModel:连接视图和数据的中间件,Vue.js就是MVVM中的ViewModel层的实现者
    在MVVM架构中,是不允许数据和视图直接通信的,只能通过ViewModel来通信,而
    ViewModel就是定义了一个Observer观察者
  • ViewModel能够观察到数据的变化,并对视图对应的内容进行更新
  • ViewModel能够监听到视图的变化,并能够通知数据发生改变
    至此,我们就明白了,Vue.js 就是一个MVVM的实现者,他的核心就是实现了DOM监听与数据绑定

为什么要使用Vue.js

  • 轻量级,体积小是一个重要指标。Vue.js 压缩后有只有20多kb (Angular 压缩后56kb+ ,
    React压缩后44kb+ )
  • 移动优先。更适合移动端,比如移动端的Touch事件
  • 易上手,学习曲线平稳,文档齐全
  • 吸取了Angular (模块化)和React (虚拟DOM)的长处,并拥有自己独特的功能,如:计算属性
  • 开源,社区活跃度高

入门案例

  • 引入cdn
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.min.js"></script>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.min.js"></script>
</head>
<body>

<div id="app">
    {{msg}}
</div>

<script>
    var vm = new Vue({
        el:"#app",
        data:{
            msg:"hello,vue!",
        }
    });
</script>
</body>
</html>

什么是MVVM?

MVVM (Model-View-ViewModel) 是一种软件架构设计模式,由微软WPF (用于替代
WinForm,以前就是用这个技术开发桌面应用程序的)和Silverlight (类似于Java Applet,简单点说就是在浏览器上运行的WPF)的架构师Ken Cooper和Ted Peters 开发,是一种简化用户界面的事件驱动编程方式。由John Gossman (同样也是WPF和Silverlight的架构师)于2005年在他的博客上发表。
MVVM源自于经典的MVC (ModI-View-Controller) 模式。MVVM的核心是ViewModel
层,负责转换Model中的数据对象来让数据变得更容易管理和使用,其作用如下:

  • 该层向上与视图层进行双向数据绑定
  • 向下与Model层通过接口请求进行数据交互

在这里插入图片描述
MVVM图解


为什么要使用MVVM

MVVM模式和MVC模式一样,主要目的是分离视图(View)和模型(Model),有几大好处

  • 低耦合:视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的
    View上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
  • 可复用:你可以把一些视图逻辑放在一个ViewModel里面,让很多View重用这段视图逻辑。
  • 独立开发:开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计。
  • 可测试:界面素来是比较难于测试的,而现在测试可以针对ViewModel来写。

VUE基础语法学习

  • if else
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.min.js"></script>
</head>
<body>
<div id="app">
    <h1 v-if="state==='A'" >A</h1>
    <h1 v-else-if="state==='B'" >B</h1>
    <h1 v-else-if="state==='C'" >C</h1>
    <h1 v-else>d</h1>
</div>
<script>
    var vm = new Vue({
        el: "#app",
        data: {
            state: "C"
        }
    });
</script>
</body>
</html>

  • for循环获取数据
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.min.js"></script>
</head>
<body>

<div id="app">
    <h1 v-for="(item,index) in items">
        msg= {{item.msg}} , index = {{index}}
    </h1>
</div>
<script>
    var vm = new Vue({
        el: "#app",
        data: {
            items: [
                {msg: 'vue'},
                {msg: 'vue2'},
                {msg: 'vue3'}
            ]
        }
    });
</script>
</body>
</html>

  • 事件

关键字:v-on
v-on 绑定时间,简写为@

<!DOCTYPE html>
<html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.min.js"></script>
</head>
<body>

<div id="app">
    <button type="button" v-on:click="sayhello" >click me</button>
</div>

<script>
    var vm = new Vue({
        el: "#app",
        data: {
            msg:"vue学习!!!"
        },
        methods:{
            sayhello:function () {
                console.log(this.msg);
            }
        }
    });
</script>
</body>
</html>

什么是双向数据绑定

**Vue.js是一个MVVM框架,即数据双向绑定,即当数据发生变化的时候,视图也就发生变化,当视图发生变化的时候,数据也会跟着同步变化。**这也算是Vue.js的精髓之处了。
 值得注意的是,我们所说的数据双向绑定,一定是对于UI控件来说的,非UI控件不会涉及到数据双向绑定。单向数据绑定是使用状态管理工具的前提。如果我们使用vuex,那么数据流也是单项的,这时就会和双向数据绑定有冲突。


为什么要实现数据的双向绑定

在Vue.js 中,如果使用vuex ,实际上数据还是单向的,之所以说是数据双向绑定,这是用的UI控件来说,对于我们处理表单,Vue.js的双向数据绑定用起来就特别舒服了。即两者并不互斥,在全局性数据流使用单项,方便跟踪;局部性数据流使用双向,简单易操作。


在表单中使用双向数据绑定

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

  • 注意:v-model 会忽略所有表单元素的value、checked、selected特性的初始值而总是将Vue实例的数据作为数据来源。你应该通过javaScript 在组件的data选项中声明初始值。

  • 数据双向绑定示例 实现之后当输入框输入相应文字 在后面提示框会输入相同文字

  • 表单input-text 、textarea、单选

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.min.js"></script>
</head>
<body>
<div id="app">
    <input type="text" v-model="msg1" /> {{msg1}}
    <br/>
    <textarea type="text" v-model="msg2" ></textarea> {{msg2}}
    <br/>
    <input type="radio" name="sex" value="" v-model="people"  /><input type="radio" name="sex" value="" v-model="people" /><p>。。。选中了{{people}}</p>
</div>
<script>
    var vm = new Vue({
        el: "#app",
        data: {
            msg1:"msg-1",
            msg2:"msg-2",
            people:'男'
        }
    });
</script>
</body>
</html>

  • select-option 下拉框
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.min.js"></script>
</head>
<body>

<div id="app">
    你的爱好:<select v-model="hobby">
    <option disabled value="">请选择</option>
    <option>coding</option>
    <option>sleep</option>
    <option>read</option>
</select>
    <span>{{hobby}}</span>
</div>

<script>
    //有value绑定value,没有value绑定text
    var vm = new Vue({
        el: "#app",
        data: {
            hobby: ''
        }
    });
</script>
</body>
</html>

第一个Vue组件

组件是可复用的Vue实例,说白了就是一组可以重复使用的模板,跟JSTL的自定义标签、Thymeleaf的th:fragment 等框架有着异曲同工之妙。通常一个应用会以一棵嵌套的组件树的形式来组织:
 注意:在实际开发中,我们并不会用以下方式开发组件,而是采用vue-cli创建.vue模板文件的方式开发,以下方法只是为了让大家理解什么是组件。
Vue.component()方法注册组件

在这里插入图片描述

关键字:v-bind
给组件绑定参数,简写为:


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.min.js"></script>
</head>
<body>
<div id="app">
<!--    绑定遍历的值与组件的接收参数-->
    <componentname v-for="item in items" v-bind:itempram="item"></componentname>
</div>
<script>
    Vue.component("componentname",{
        //接收参数item,与v-bind上一致
        props:['itempram'],
        //组件模板
        template:'<h1>{{itempram}}</h1>'
    });
    var vm = new Vue({
        el: "#app",
        data: {
            items:["java","python","linux","web"]
        }
    });
</script>
</body>
</html>

Vue的生命周期

官方文档: https://cn.vuejs.org/v2/guide/instance.html#生 命周期图示
Vue实例有一个完整的生命周期,也就是从开始创建、初始化数据、编译模板、挂载DOM、渲染→更新→渲染、卸载等一系列过程,我们称这是Vue的生命周期。通俗说就是Vue实例从创建到销毁的过程,就是生命周期。
在Vue的整个生命周期中,它提供了一系列的事件,可以让我们在事件触发时注册JS方法,可以让我们用自己注册的JS方法控制整个大局,在这些事件响应方法中的this直接指向的是Vue的实例。

在这里插入图片描述


在这里插入图片描述


Axios异步通信(通信框架)

Axios是一个开源的可以用在浏览器端NodeJS异步通信框架,她的主要作用就是实现AJAX异步通信,其功能特点如下:

  • 从浏览器中创建XMLHttpRequests
  • 从node.js创建http请求
  • 支持Promise API [JS中链式编程]
  • 拦截请求和响应
  • 转换请求数据和响应数据
  • 取消请求
  • 自动转换JSON数据
  • 客户端支持防御XSRF (跨站请求伪造)
    GitHub: https://github.com/ axios/axios
    中文文档: http://www.axios-js.com/

为什么要使用Axios

由于Vue.js是一个视图层框架且作者(尤雨溪) 严格准守SoC (关注度分离原则),所以Vue.js并不包含AJAX的通信功能,为了解决通信问题,作者单独开发了一个名为vue-resource的插件,不过在进入2.0 版本以后停止了对该插件的维护并推荐了Axios 框架。少用jQuery,因为它操作Dom太频繁!


Axios使用实例

<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.19.2/axios.min.js"></script>
    <style>
        /*没有加载完,不显示。*/
        [v-clock] {
            display: none;
        }
    </style>
</head>
<body>
<div id="app" v-clock>
    <a v-bind:href= info.url >点击跳转到百度</a><br/>
    {{info.name}}<br/>
    {{info.url}}<br/>
    {{info.age}}<br/>
    {{info.sex}}<br/>
    ===================<br/>
    {{info.address}}<br/>
    {{info.address.street}}<br/>
    {{info.address.city}}<br/>
    {{info.address.country}}<br/>
    ===================<br/>
    {{info.links[0]}}<br/>
    {{info.links[1]}}<br/>
    {{info.links[2]}}<br/>
</div>
<script>
    var vm = new Vue({
        el: "#app",
        //data()是方法,与"data:"不同,它是属性
        data() {
            return {
                info:{}//可不写出结构
            }
        },
        mounted() {//mounted用于ajax。钩子函数、链式编程、ES6新特性。
            axios.get('data.json').then(returnJsonValue => (this.info = returnJsonValue.data));
        }
    });
</script>
</body>
</html>
  • 与html文件同路径的data.json
{
  "name": "wei",
  "age": "18",
  "sex": "男",
  "url":"https://www.baidu.com",
  "address": {
    "street": "某某县",
    "city": "某某市",
    "country": "中国"
  },
  "links": [
    {
      "name": "bilibili",
      "url": "https://www.bilibili.com"
    },
    {
      "name": "baidu",
      "url": "https://www.baidu.com"
    },
    {
      "name": "test",
      "url": "https://www.test.com"
    }
  ]
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nickkkkkkkkk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值