vue框架

- 构建用户界面的渐进式框架

- 采用自底层向上增量开发的设计

- 核心库只关注视图层

- 当与单文件组件和vue生态系统支持的库结合使用时,也完全能够为复杂的单页应用程序提供驱动

- vue通过api 来进行统一性的管理,可以让整个团队的代码都用统一的风格和方法标准去运作

- 在封装组件时通过Props和Event 两个标准性的原则去调用

 

一个todo-list应用集成了两个事件,两条data数据就能完成了,通过Template 里的Html模版能清楚的观察到绑定信息,数据联动和实时改动:

  • v-model 里的msg和实例data里存放的数据进行了绑定
  • @keyup.enter = "push" 对键盘事件keyup进行舰艇,同时用enter 修饰符进行enter按键进行监听,当触发methods里的push函数,想这个list列表里添加一条object数据
  • 通过v-for指令循环出整个list里的数据,循环出相对应的节点数
  • 点击每个节点的时候执行deleteItem事件,删除对应的节点
    <template>
    <!-- todo-list模版 -->
    <div id="todo-list">
    <!-- 定义input输出标签,双向绑定输出数据msg,对keyup进行监听绑定按钮事件push事件 -->
    <input type="text" v-model.trim="msg" @keyup.enter="push">
    <ul>
    <!-- v-for指令循环整个list里面的数据 -->
    <li v-for="(item,index) in list" :key="index" @click="deleteItem(index)">
    {{index}}{{item.name}}
    </li>
    </ul>
    </div>
    </template>
    <script>
    export default {
    name:'todo-list',
    data(){
    return(
    {
    msg:"",
    list:[],
    }
    )
    },
    methods:{
    push(){
    //向list数组中push新输入的input的msg信息
    this.list.push({name:this.msg});
    this.msg = ""
    },
    deleteItem(index){
    //删除所对应的index节点
    this.list.splice(index,1) }
    }
    }
    </script>

    对于往时操作dom写法与当前vue数据驱动区别

  • 数据渲染,会通过第三方的模版引擎,如artTemplate,Jade等等,渲染完成之后再append到根元素中
  • vue只是通过一个v-for指令循环所有对应的节点,先前只要再Html中写好循环模版
  • 执行事件,需要选取DOM元素,对DOM元素addEventListener事件进行函数监听
  • Vue直接通过你的Template集成模版在需要发生事件的元素上直接绑定事件,只要执行一个v-on结合你需要绑定的事件,所有原生的事件都直接
  • 需要存储数据时,需要定一堆变量,有局部变量和全局变量,导致后续的变量难以维护,甚至可能会导致变量名冲突,作用域调用错误,无法准确定位到正确的数据源
  • Vue通过data选项,用每个属性去保存渲染的数据和临时过度的数据,用统一data选项去保存,让使用者一目了然
  • 所有执行的函数,无论是事件所需要执行的,还是封装所需要调用的函数,通过函数式声明在script标签内写入,代码量大了,也会存在变量名冲突 和无法准确的定位方法
  • Vue通过Methods选项专门为事件所执行的函数和所封装需要调用的函数,就像垃圾桶一样,有一个准确的可投放的位置,需要找到执行和所需要调用的函数,直接可以准确定位到Methods选项
  • 平时我们要对有些数据进行一些处理,比如说 去除有后空格,按键的空位,都要通过js去过滤或者判断
  • Vue提供大量的修饰符封装了这些过滤和判断,让开发少写代码,把时间投入业务,只需要用.修饰符

用户进行某个操作 -> 反馈到VM处理(可导致Model变动) -> VM层改变,通过绑定关系直接更新页面对应位置的数据

可以简单理解:数据驱动不是操作节点的,而是通过虚拟的抽象数据来直接更新页面。主要这点,数据驱动框架才得以有较快的运行速度

VUE模式

通过 {{ }} 绑定文本节点,data里的动态数据与Props静态数据进行一个映射关系,当data中的属性或者Props中的属性有变动,以上两者里的每个数据都是行为操作需要的数据或者模版view需要渲染的数据,一旦其中一个属性发生变化,则所有关联的行为操作和数据渲染的模版上的数据同一时间进行同步变化,这种数据驱动的模式更渐变于大型应用开发。只要合理的组织数据和代码,就不会显得后续皮软

事件驱动

事件驱动一定程度弥补了数据驱动的不足

在DOM操作:通过特定的选择器查找到需要操作的节点 -> 给节点添加相应的事件监听

响应用户操作:用户执行某事件(点击,输出,后退等) -> 调用JavaScript来修改节点

缺点:系统会越来越庞大,频繁找节点和修改节点,效率过低

数据驱动

读取模版,同时获得数据,并简历VM(view-model)的抽象层 -> 在页面进行填充

MVVM对应三个层

M-Model     可以理解为  数据层

V-View             视图

VM-ViewModel          视图模型(虚拟层)  可以与V层进行数据绑定; (V 和M 双向互动)

data选项

当一个实例创建的时候,Vue会将其响应系统的数据放在data选项中,当这些属性的值发生改变时,视图将会产生“响应”,即匹配更新为新的值。初始定行的行为代码也都会随着响应系统进行一个映射,而data中的数据在实例中可以任意改变,不受任何影响,前提必须数据要跟逻辑相辅相成

<template>
<div>
<p v-if="boolean">true</p>
<p v-for="value in obj ">{{vallue}}</p>
<p v-for="item in list">{{item}}</p>
<p>{{StringMsg}}</p>
<p>{{NumberMsg}}</p>
</div>
</template>
<script>
export default {
data(){//data数据
return {
obj:{a:'1',b:'2',c:'3'}, //对象obj,用v-for遍历
list:["a","b","c"], //数组list,用v-for遍历
boolean:true, //布尔值,用v-if判断
StringMsg:"hello world", //字符串对象
NumberMsg:2.4 //数字对象 }
}
}
</script>

动态数据data 和 静态数据Props 对比:

相同点:

  • 两者选项里都可以存放各种类型的数据,当行为操作改变时,所有行为操作所用到的和模版所渲染的数据同事都会发生同步变化

不同点

  • data被称为动态数据的原因,在各自实例中,在任何情况下,都可以随意改变它的数据类型和数据结构,不会被任何环境所影响
  • props被称为静态数据的原因,在各自实例中,一旦初始化被定义好类型时,基于Vue的单向数据流,在数据传递时始终不能改变它的数据类型
  • 更为关键的是,对数据单向流的理解,props的数据都是通过父组件或者更高级的组件数据或者字面量的方式进行传递的,不允许直接操作改变各自实例中的props数据,而是需要通过别的手段,改变传递源中的数据

在运行代码时,data选项已经进入了Vue的响应系统。model(数据层)和View(视图层)进行了对应的响应任何数据类型都可以定义

当用户发生点击操作的时候,同事可以把StringMsg,NumberMsg的数据对调,充分说明了 “无论值和类型都可以进行随意转换”。

总结:

  • data里的数据是灵活的
  • 可以定义任何数据类型
  • 可以改变任何数据类型
  • 当数据变化时,视图和行为绑定的数据都会同步改变

视图与数据映射

data数据:

<template>
<div>
<p>{{StringMsg}}</p>
<p>{{NumberMsg}}</p>
<button @click="changeData">改变数据</button>
</div>
</template>
<script>
export default {
data(){
return{
StringMsg:"hello world",
NumberMsg:24
}
},
methods:{
changeDate(){
this.StringMsg=24,
this.NumberMsg="hello world"
}
}
}
</script>

此.vue就是一个实例,在data定义了两种数据,String类型,Number类型,同时还在methods定义了changeDate() 事件

Props

使用props传递数据作用域是孤立的,它是父组件通过模版传递而来,想接受父组件传来的数据,需要通过props来进行接受

子组件需要显示的声明接受父组件传递来的数据的{ 数量,类型,初始值 }

简单的接受可以通过数组的类型来接受 props:['props']

父组件:

  <!-- 父组件 -->
<template>
<div>
<!-- 在父组件html中写入子组件demo -->
<!-- 分别将父组件的数据msgData mathData绑定,传递给子组件 -->
<demo :msg="msgData" :math="mathData"></demo>
</div>
</template>
<script>
//引入子组件Demo
import Demo from './demo.vue';//
export default {
data(){
//设置父组件的data数据
return {
msgData:"父传给子",
mathData:2
}
},
conponents:{
Demo
}
}
</script>

子组件

    <!-- 子组件 -->
<template>
<div class="demo">
<p>{{msg}}</p>
<p>{{math}}</p>
</div>
</template>
<script>
export default {
name:'demo',
props:['msg','math']//接受父组件传递的值
}
</script>
: == v-bind
:msg = msgData
//msg 第一个参数必须要与子组件的props同名 : props:['msg']
//msgData 则是父组件中需要向子组件传递的数据

在子组件需要通过显示定义好需要从父组件中接受那些数据,同样的在父组件中,在子组件模版中v-bind来传递子组件中需要显示接受的数据

props可以显示定义一个或者一个以上的数据,对于接受的数据,可以是各种数据类型,同样可以传递一个函数

vue框架学习笔记(vue入门篇)的更多相关文章

  1. vue第四单元(初识vue-在页面中直接引入vue框架-学习使用vue语法-vue的指令-介绍data用法-methods用法)

    第四单元(初识vue-在页面中直接引入vue框架-学习使用vue语法-vue的指令-介绍data用法-methods用法) #课程目标 了解 vue 框架的特点 掌握创建 vue 实例 掌握 data ...

  2. Asp.Net Core学习笔记:入门篇

    Asp.Net Core 学习 基于.Net Core 2.2版本的学习笔记. 常识 像Django那样自动检查代码更新,自动重载服务器(太方便了) dotnet watch run 托管设置 设置项 ...

  3. Sass学习笔记之入门篇

    Sass又名SCSS,是CSS预处理器之一,,它能用来清晰地.结构化地描述文件样式,有着比普通 CSS 更加强大的功能. Sass 能够提供更简洁.更优雅的语法,同时提供多种功能来创建可维护和管理的样 ...

  4. Vue.js学习笔记 第七篇 表单控件绑定

    本篇主要说明表单控件的数据绑定,这次没有新的知识点 文本框 1.普通文本框 <div id="app-1"> <p><input v-model=&q ...

  5. Vue.js学习笔记 第八篇 组件

    全局注册组件 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...

  6. Vue.js学习笔记 第六篇 内置属性

    computed属性 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &l ...

  7. Vue.js学习笔记 第五篇 事件处理

    监听事件 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...

  8. Vue.js学习笔记 第四篇 列表渲染

    遍历数组和对象 和条件选择一样,循环也和其他语言类似,也尝试着用一个例子解决问题 <!DOCTYPE html> <html> <head> <meta ch ...

  9. Vue.js学习笔记 第三篇 条件渲染

    条件选择 条件选择的用法和其他语言类似,一个例子就能解决所有问题 <!DOCTYPE html> <html> <head> <meta charset=&q ...

随机推荐

  1. condense 参数

    " 删除左右空格,中间空格压缩至一格 result = condense( ' abc def ').result = condense( val = ' abc def '). " ...

  2. Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

    使用Qt写了个窗口,运行报错,无法正常运行python程序,获得的报错信息如下: Process finished with exit code 139 (interrupted by signal ...

  3. ABP入门教程0 - 目录

    ABP入门教程 本教程主要讲解如何基于ABP实现CURD(增删改查)示例. 源码已分享:   GitHub   Gitee ABP入门教程0 - 目录 ABP入门教程1 - 开篇 ABP入门教程2 - ...

  4. PWA学习笔记(二)

    设计与体验 APP Shell: 1.应用从显示内容上可粗略划分为内容部分和外壳部分,App Shell 就是外壳部分,即页面的基本结构 2.它不仅包括用户能看到的页面框架部分,还包括用户看不到的代码 ...

  5. SQL Server优化技巧——如何避免查询条件OR引起的性能问题

    之前写过一篇博客"SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析",里面介绍了OR可能会引起全表扫描或索引扫描的各种案例,以及如何优化查询条件中含有OR的SQL语句的 ...

  6. MySQL数据库~~~~~查询行(文件的内容)

    1. 单表查询 语法 select distinct 字段 from 库名.表名 where 条件 group by 字段 # 分组 having 筛选 # 过滤 order by 字段 # 排序 l ...

  7. django 做 migrate 时 表已存在的处理

    在开发web的时候,如果是以前已存在的项目,项目下载下来后,为了使用测试库的数据,会直接将整个测试库(如sqlite3)拿到本机来.这种情况下,如果执行的顺序不对,很容易在执行migrate的时候出现 ...

  8. docker容器虚拟化技术

    简单来说,在Windows系统下安装各种运行环境的坑简直不要太多了(● ̄(エ) ̄●),并不仅限于docker.Nginx.PHP.Python等等,我会尽详细写出实际过程中遇到的各种各样的奇葩问题 1 ...

  9. Cocos2d-x项目编译为Android应用——命令行方式

    配置: 相关工具:Cocos2d-x 3.2 + Ant 1.9.4 + Android NDK r9d + Android SDK 运行平台:OS X 10.9.4+ Xcode 6 前言:笔者使用 ...

  10. Codefest19受虐记

    date: 2019-08-28 前言 比赛链接:Codefest 19 A题 思路: 这是一道水题.你对着样例递推打一个表出来,会发现结果三个一组循环. 例如:A = [3, 4, 7, 3, 4, ...