MV*模型及部分vue
vue是什么?
Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架。与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计。Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已有项目整合。另一方面,Vue 完全有能力驱动采用单文件组件和Vue生态系统支持的库开发的复杂单页应用。
为什么用VUE?
1.性能更好
虚拟了dom的操作,操作dom是非常耗费性能的一件事情 jquery就是专门操作dom的
操作dom会导致重绘和重排
2.视图、数据分离
Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。
3.兼容性较好
Vue.js 不支持 IE8 及其以下版本,因为 Vue.js 使用了 IE8 不能实现的 ECMAScript 5 特性。 Vue.js 支持所有兼容 ECMAScript 5 的浏览器。
4.其便捷性及易用程度都很好
vue是一个渐进式的框架,vue当成一个插件,库,框架 完整的应用 来使用都是OK的
MVVM是什么?
MVVM是Model-View-ViewModel的简写, 一种新型架构框架。
View一般就是我们平常说的HTML文本的Js模板,里面可以嵌入一些js模板的代码;
ViewModule层里面就是我们对于这个视图区域的一切js可视业务逻辑,举个例子,比如图片走马灯特效,比如表单按钮点击提交,这些自定义事件的注册和处理逻辑都写在ViewModule里面;Model就是对于纯数据的处理,比如增删改查,与后台CGI做交互;
MVVM是将“数据模型数据双向绑定”的思想作为核心,因此在View和Model之间没有联系,通过ViewModel进行交互,而且Model和ViewModel之间的交互是双向的,因此视图的数据的变化会同时修改数据源,而数据源数据的变化也会立即反应到View上。
MVVM原理?
vue采用数据劫持配合订阅者和发布者模式的方式 ,
通过 Object.defineProperty 的setter 和 getter 对数据进行劫持 ,
在数据变化时, 发布消息给依赖器 Dep(订阅者), 去通知观察者Watcher 做出对应的回调函数 , 进行视图更新
MVVM 作为绑定入口 , 整合Observer , Compile 和Watcher 三者 , Observer来监听model数据变化 ,
Compile来解析编译模板指令 , 最终利用Watcher 搭建起 Compile , Observer , Watcher 之间的通信桥梁 ,
达到数据 变化=> 视图更新 /; 视图交互变化 => 数据model变更的双向绑定效果
VUE基本用法
例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> </head> <body> <div id="app"> <!-- 插值表达式用 {{}} --> <!-- 使用数据的时候,需要先放在data中,数据要先存入,才能实现数据绑定 --> {{ name }} <!-- 原始数据的值可以直接发生改变 --> <!-- 数组 --> <!-- 通过索引的方式改变数组,不能渲染到视图 --> <!-- 通过length属性修改也是不能渲染到视图 --> <!-- 可以通过数组的push,pop,shift,unshift,sort,reverse,splice这些操作数组可以渲染 --> {{arr}} <!-- 对象 --> {{obj}} <!-- 可以通过对象打点的形式修改,可以渲染视图 --> <!-- 对象打点的形式增加属性,不能渲染视图 --> <!-- 对象重新赋值(更改地址)以后可以渲染视图,可以使用ES6中的...运算符 --> <!-- vm.$set(vm.obj,'abc',2000) 增加属性,渲染视图 --> <!-- vm.$el() 指代被渲染的dom元素 --> <!-- vm.$nextTick(function(){}) 最后一次渲染完成以后执行的函数 --> <!-- vm.$mount() 可以取代vue实例中的el属性,渲染的dom元素 --> </div> <script> const vm = new Vue({ // el : "#app", data : { name : "psh", arr : [1,2,3], obj : { a : 10, b : 20 } } }) vm.$mount("#app"); console.log(vm.$el.innerText); vm.name = "yinlaoshi"; console.log(vm.$el.innerText); vm.name = "wanglaoshi" vm.$nextTick(() => { console.log(vm.$el.innerText); }) </script> </body> </html>
vue-指令
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>指令</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <style> [v-cloak] { display: none; } </style> </head> <body> <div id="app"> <!-- 1.v-pre 跳过该元素和它的子元素的渲染过程,直接显示内容 --> <div v-pre> {{ name }} <div>{{ name }}</div> </div> <!-- 2. v-cloak 可以配合着css的使用,让第一次加载的时候不显示(隐藏未编译的{{}}标签) --> <div>{{ name }}</div> <!-- 3. v-once 只会去进行一次渲染,随后的重新渲染,当数据改变时,这里的数据不会改变,元素/组件及所有的子节点全部都会认为是静态的,忽略并跳过,进行了vue的内部的缓存,所有的值全都是从缓存中拿过来 --> <div v-once>{{name}}</div> <!-- 4. v-html innerHTML 用到的比较少,XSS攻击 和插值表达式的区别,v-html是把标签里面的内容全部替换 --> <div v-html="dom">今天天气很好</div> <div>{{ dom }}今天天气很好</div> <!-- 5. v-text 相当于innerText --> <!-- 6. v-if 判断元素是否存在 --> <!-- 7. v-else --> <!-- 8. v-else-if --> <!-- <div v-if="flag">hello</div> --> <!-- template是可以减少渲染次数的 --> <template v-if="!flag"> <p>hello</p> <span>world</span> </template> <!-- <div>---</div> --> <template v-else> <p>hello1</p> <span>world2</span> </template> <!-- 9.v-show --> <div v-show="!flag">hello world</div> <template v-show="!flag"> <div>hello world</div> </template>
<button @click="flag=!flag">点击我</button> <!-- v-if和v-show的区别 1.v-if是直接移出dom节点,v-show是通过控制display属性 2.v-if支持template标签 v-show不支持template标签 --> </div> <script> const vm = new Vue({ el : "#app", data : { name : "wxy", age : 18, dom : "<h1>hello world</h1>", flag : true } }) setInterval( () => { vm.flag = !vm.flag; },500) </script> </body> </html>
vue-指令补充
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>指令</title> <script src="public/vue/dist/vue.min.js"></script> </head> <body> <div id="example"> <!-- 循环 --> <ul> <li v-for="tmp in list"> {{tmp}} </li> </ul> <ul> <li v-for="(value,key) in list"> {{"key is " + key + " value is " + value}} </li> </ul> <!-- 选择/判断 --> <button v-if="hasMore">加载更多</button> <!-- 为true的时候显示,为false的时候隐藏 --> <p v-if="!hasMore">对不起,没有更多数据可以加载了</p> <!-- 判断分支结构 --> <p v-if = "answer == 0">答案是0</p> <p v-else-if = "answer == 1">答案是1</p> <p v-else-if = "answer == 2">答案是2</p> <!-- v-text v-html v-show --> <p v-text = "myHtml">this is a container</p> <p v-html = "myHtml">this is a container</p> <p v-show = "hasMore">this is a container</p> <!-- 将urlName的内容绑定到a的href中 --> <a v-bind:href = "urlName">走,去百度</a> <!-- 相似的还有img中的src --> <a :href = "urlName">走,去百度</a> <!-- 按钮绑定处理函数 --> <button v-on:click = "clickMe">点我试试</button> <button @click = "clickMe()">再点我试试</button> <input type="text" @input = 'inpchange'> </div> <script> new Vue({ el : '#example', data : { list : [100,200,300], hasMore : false, answer : 2, myHtml : '<h1>这是一个被替换的文本</h1>', urlName : 'http://www.baidu.com' }, methods : { clickMe : function(){ console.log('叫你点你就点呀'); }, inpchange : function(){ console.log(event); console.log(event.target.value); } } }) </script> </body> </html>