Vue 入门 二 笔记

161 阅读6分钟

这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战

vue 概述

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

前端的三要素

●HTML (结构) :超文本标记语言(Hyper Text Markup Language) ,决定网页的结构和内容 ●CSS (表现) :层叠样式表(Cascading Style Sheets) ,设定网页的表现样式 ●JavaScript (行为) :是-种弱类型脚本语言,其源代码不需经过编译,而是由浏览器解释运行, 用于控制网页的行为

什么是vue

●Vue:一款渐进式JavaScript框架,所谓渐进式就是逐步实现新特性的意思,如实现模块化开 发、路由、状态管理等新特性。其特点是综合了Angular (模块化)和React (虚拟DOM)的. 优点;

为什么要使用vue?

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

**什么时MVVM **

在这里插入图片描述

为什么要使用MVVM

Mvvm 模式和MVC 模式一样,主要目的是分离视图(view)和模型(model),有几大好处 低耦合:视图可以独立于Model 变化和修改,一个View Model 可以绑定到不同的view 上,当view 变化的时候Model可以不变,反之也行 可复用:可以把一些视图放在一个View Model 里面,让很多view 重用 这段视图逻辑 独立开发:开发人员可以专注业务逻辑和数据开发,设计人员可以专注与页面设计 可测试:界面素来是比较难于测试的,而现在测试可以针对ViewModel 来写

Mvvm模式的实现者

Model :模型层,这里表示JavaScript对象 View:视图层,在这里表示Dom (Html 操作得对象) 在MVVM 架构中,连接视图和数据中间件,Vue .js 就是MVVM 中 ViewModel 层的 实现者,在MVVM 架构中,是不允许数据和视图直接通信的。 他的核心就是实现了,数据的绑定和Dom的监听。

我的第一个vue 小demo

在这里插入图片描述 新建一个html 页面

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

</head>
<body>
<p style="color: red" id="demo1">
    {{message}}
</p>

<script>


  var vm=new Vue({
      el:"#demo1",
      data:{
          message:"你好啊,我的第一个VUE demo!1"
      }

  });

</script>
</body>
</html>

效果 在这里插入图片描述 在这里插入图片描述

除了可以这样取值还可以用

<!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.21/dist/vue.min.js"></script>

</head>
<body>
<p style="color: red" id="demo1" v-bind:title="message">
  你把鼠标划上去,就可以看到消息了!

</p>

<script>


  var vm=new Vue({
      el:"#demo1",
      data:{
          message:"你好啊,我的第一个VUE demo!1"
      }

  });

</script>
</body>
</html>

你看到的v-bind等被称为指令。指令带有前缀v-,以表示它们是Vue提供的特殊特性。可能你 已经猜到了,它们会在渲染的DOM上应用特殊的响应式行为。在这里,该指令的意思是:“将这个元 素节点的title特性和Vue实例的message属性保持- -致”。 在这里插入图片描述 其他简单的指令 在这里插入图片描述 vue 也有遍历的 在这里插入图片描述 第一个点击事件

<!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.21/dist/vue.min.js"></script>

</head>
<body>
<button v-on:click="hello" id="demo1">
    点击我
</button>

<script>


  var vm =new Vue({
      el:"#demo1",
      data: {
          message: "娇娇的第一点击事件!"
      },
      methods:{
          hello: function (event) {
        alert(this.message)
          }
      }

  });

</script>
</body>
</html>

Vue 表单双绑,组件

什么是双向数据绑定? Vue.js 是一个MVVM 框架,即数据双向绑定,即当数据发生变化的时候,视图也就发生变化,当视图发生变化的时候,数据也会跟着同步。这种数据双向绑定一定是对于UI 控件来说的,不是ui 控件不会涉及到的数据双向绑定。单向数据绑定是使用状态管理工具的前提。如果我们使用vuex那么数据流也是单项的,就会和双向数据绑定发生冲突。

为啥要实现数据的双向绑定

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

表单如何使用双向绑定

你可以用v-model指令在表单. 及 元素上创建双向数据绑定

input 的数据双向绑定

<!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.21/dist/vue.min.js"></script>

</head>
<body>
<div style="color: #45bb51" id="demo1">
    <input type="text" v-model="message">
    你输入的是:
    <p>
{{message}}</p>
</div>

<script>


  var vm=new Vue({
      el:"#demo1",
      data:{
          message:"",
      }

  });

</script>
</body>
</html>

效果

会跟你输入的一起变化。 在这里插入图片描述

单选款的

<!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.21/dist/vue.min.js"></script>

</head>
<body>
<div style="color: #45bb51" id="demo1">
    <input type="radio" v-model="message" value="男" name="sex"><input type="radio" v-model="message" value="女" name="sex"> 女
    你输入的是:
    <p>
{{message}}</p>
</div>

<script>


  var vm=new Vue({
      el:"#demo1",
      data:{
          message:"",
      }

  });

</script>
</body>
</html>

在这里插入图片描述多选框的

<!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.21/dist/vue.min.js"></script>

</head>
<body>
<div style="color: #45bb51" id="demo1">
   <select  v-model="message">

       <option disabled value="">
           请选择
       </option>
       <option>苹果</option>
       <option>香蕉</option>
       <option>草莓</option>
   </select>
    你选择的是:
    <p>
{{message}}</p>
</div>

<script>


  var vm=new Vue({
      el:"#demo1",
      data:{
          message:"",
      }

  });

</script>
</body>
</html>

效果 在这里插入图片描述 在这里插入图片描述

什么是组件

组件是可复用的VUE 实例,就是一组可以重复使用的模板,跟JSTL 的自定义标签,thymeleaf 的 th:fragment 等框架有着异曲同工之妙。

自定义自己的第一个标签

<!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.21/dist/vue.min.js"></script>

</head>
<body>
<div style="color: #45bb51" id="demo1">
<jiaojiao></jiaojiao>
</div>

<script>
Vue.component('jiaojiao',{
    template: '<a href="#">jiaojaio</a>'

})

  var vm=new Vue({
      el:"#demo1",


  });

</script>
</body>
</html>

效果 在这里插入图片描述 如何实现数据交互 在这里插入图片描述效果 在这里插入图片描述

使用props 属性传递参数

单纯的定义一个便签是没有用的,我们需要传递数据,就需要用的是props 属性

其他的说明

v-for="item in items" 遍历Vue 实例中定义的名为items 的数组,并创建同等数量的组件 v-bind:feng="item" 将item 项绑定到组件中props 定义的名为item 属性上;= 号左边的item 为props 定义的属性名,右边的为item in items 中遍历的item 项的值。

Vue 的生命周期

Vue 实例有一个完整的生命周期,也就是从开始创建,初始化数据,编译模板,挂载Dom ,渲染--更新--渲染,卸载等一系列过程,我们称为这是Vue 的生命周期,通俗说就是Vue 实例创建到销毁的过程,就是生命周期 在Vue 的整个生命周期,它提供了一系列的事件,可以让我们在事件时注册js 方法,可以让我们用自己注册的js 方法控制整个大局,在这些事件响应方法中this 直接指向的Vue 的实例

遍历json 数据实现

<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-if="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--引入JS文件-->
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>


</head>
<body>
<div style="color: red" id="demo1">
<p>{{info.name}}</p>
    <p>{{info.address.street}}</p>
</div>

<script>


  var vm=new Vue({
      el:"#demo1",
      data(){
      return{
          //请求的返回参数 和json 字符串一样
          info:{
              name :null,
              address: {
                  street: null
              }
          }
      }
      },
mounted(){
          //钩子函数 ,链式编程,ES6 新特性
    axios.get('../data.json').then(response=>(this.info=response.data))
}
  });

</script>
</body>
</html>

效果 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

计算属性

计算属性的重点突出在属性两个字上(属性是名词),首先他是个属性其次这个属性有计算的能力(计算是动词) ,这里的计算就是个函数,简单来说,它就是一个能够将计算结果缓存起来的属性(将行为转换成了静态的属性),可以理解为缓存。

<!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.21/dist/vue.min.js"></script>

</head>
<body>
<div id="demo1" style="color: #45bb51">
<p>one {{currentTime1()}}</p>
    <p>two {{currentTime2}}</p>
</div>

<script>


  var vm=new Vue({
      el:"#demo1",
      data:{
          message:"你好啊,我的第一个VUE demo!1"
      },
        methods: {
        currentTime1: function () {
        return Date.now();   //返回的是一个时间
        }
        },
      computed: {
          //计算属性 : methods computed 方法名不可以重复,重复后就只能调用methods
          currentTime2: function () {
              return Date.now();   //返回的是一个时间
          }

      }
  });

</script>
</body>
</html>

在这里插入图片描述 计算属性总结 计算属性的主要特征就是为了将不经常变化的计算结果进行缓存,节约我们系统的开销。 内容分发 在vue.js 中我们使用 元素作为承载分发内容的出口。可以应用在组合组件场景中

<!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.21/dist/vue.min.js"></script>

</head>
<body>
<div id="dmeo1" style="color: #45bb51">
<todo>
<todo-title slot="todo-title" :title="title"></todo-title>
<todo-items slot="todo-items" v-for="item in todoItems" :item="item"></todo-items>
</todo>
</div>
<script>
// slot : 插槽
Vue.component("todo",{
    template: '<div>\
               <slot name="todo-title"></slot>\
               <ul>\
                 <slot name="todo-items"></slot>\
                 </ul>\
                 </div>\
    '
});
//标题
Vue.component("todo-title",{
    props: ['title'],
    template: '<div>{{title}}</div>'
});
//遍历里的
Vue.component("todo-items",{
    props: ['item'],
    template: '<li>{{item}}</li>'
});

  var vm=new Vue({
      el:"#dmeo1",
      data:{
          title: "娇娇的demo",
          todoItems: ['哈哈哈哈','嘿嘿嘿','嘻嘻嘻嘻嘻']
      }

  });

</script>
</body>
</html>

自定义

<!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.21/dist/vue.min.js"></script>

</head>
<body>
<div id="dmeo1" style="color: #45bb51">
<todo>
<todo-title slot="todo-title" :title="title"></todo-title>
<todo-items slot="todo-items" v-for="item in todoItems" :item="item" v-bind:index="index" v-on:remove="removeItems(index)" :key="index"></todo-items>
</todo>
</div>
<script>
// slot : 插槽
Vue.component("todo",{
    template: '<div>\
               <slot name="todo-title"></slot>\
               <ul>\
                 <slot name="todo-items"></slot>\
                 </ul>\
                 </div>\
    '
});
//标题
Vue.component("todo-title",{
    props: ['title'],
    template: '<div>{{title}}</div>'
});
//遍历里的
Vue.component("todo-items",{
    props: ['item','index'],
    template: '<li>{{index}}---{{item}}<button @click="remove">删除</button></li>',
    methods: {
        remove: function (index) {
            this.$emit('remove',index)
            alert(11)
        }
    }

});

  var vm=new Vue({
      el:"#dmeo1",
      data:{
          title: "娇娇的demo",
          todoItems: ['哈哈哈哈','嘿嘿嘿','嘻嘻嘻嘻嘻']
      },
      methods: {
          removeItems: function (index) {
            this.todoItems.splice(index,1)//一次删除一个元素
          }
      }

  });

</script>
</body>
</html>

入门小结

核心:数据驱动,组件化 优点:借鉴了AngulaJs 的模块化开发和React 的虚拟Dom ,虚拟Dom 就是把Dom操作放到内存 中执行 常用的属性: v-if v-else-if v-else v-for v-on 绑定事件,简写 v-model 数据双向绑定 v-bind 给组件绑定参数,简写 组件化 组合组件slot 插槽 组件内部绑定事件需要使用到 this.$emit('事件名',参数) 计算属性的特点,缓存计算数据 遵循Soc 关注分离原则,Vue 是纯粹的视图框架,并不包含,比如Ajax 之类的通信功能问题,我们需要使用Axios 框架做一步通信