赞
踩
优点:1.组件化开发能大幅提高开发效率、测试性,复用性。轻量级,虚拟dom,响应式,单页面路由,数据与视图分开。
缺点:单页面不利于SEO,不支持IE8一下,首屏加载时间长。
不支持 ie8 及以下,部分兼容 ie9 ,完全兼容 10 以上,因为 vue 的响应式原理是基于 es5
的 Object.defineProperty(),而这个方法不支持 ie8 及以下
相同点:
不同点:
- // react
- const [dataList, setData] = useState([]);
- const { package_list, update_tip, download_package_id } = res.data.data;
- setData(package_list);
-
- // 初始化列表和版本状态
- useEffect(() => {
- getInit();
- }, []);
MVC
MVVM
vue 双向数据绑定是通过 数据劫持 结合 发布订阅模式 的方式来实现的, 通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调
具体步骤:
第一步:需要observe的数据对象进行递归遍历,包括子属性身上的属性也都加上setter和getter,这样的话,给这个对象的某个值赋值,就会触发setter,那么就监听到了数据的变化。
第二步:compile解析模板指令,将模板中的变量转化为数据,然后初始化渲染页面视图,并将每个指令对应的节点绑定更新函数,添加监听数据的订阅者,一旦数据有变动,收到通知,更新视图。
第三步:watcher订阅者是observe和compile之间通信的桥梁,主要做的事情是:
1、在自身实例化时往属性订阅器(dep)里面添加自己
2、自身必须有一个update()方法
3、待属性变动dep.notice()通知时,能调用自身的update()方法,并触发compile中绑定的回调,则功成身退。
第四步:MVVM作为数据绑定的入口,整合observe、compile和watcher三者,通过observe来监听自己的model数据变化,通过compile来解析编译模板指令,最终利用watch搭起observe和compile之间的通信桥梁,达到数据变化-->视图更新,视图交互变化(input)-->数据model变更的双向绑定效果
比如点击按钮修改名字,这时候直接打印 this.ref.refContent.innerText 还是原来的名字
dom更新完毕后执行回调,确保操作更新后的dom
递归就是函数内部自己调用自己
- function sum(n) {
- if(n === 1) {
- return 1;
- }
- return n + sum(n - 1)
- }
- console.log(sum(10)) //55
实例创建 —— dom挂载 —— 数据更新 —— 销毁
vue的生命周期常见的主要分为4大阶段8大钩子函数
1. 创建前后
2. dom 挂载前后
3. 数据更新前后
4. 销毁前后
另外还有两个生命周期不常用:
Vue内部的v-model
是完成属性绑定 和事件监听 的语法糖。v-model用于表单数据的双向绑定,其实它就是一个语法糖,这个背后就做了两个操作:
- <input type='text' v-model='name'/>
- <input type='text' :value='name' @input='name=$event.target.value' />
在vue2中v-for的优先级高于v-if,可以放在一起使用,但是不建议这么做,会带来性能上的浪费
在vue3中v-if的优先级高于v-for,一起使用会报错。
可以通过在外部添加一个标签,将v-for移到外层vue2
vue组件通讯大致有三种:父传子,子传父,还有兄弟之间通讯
第一种:父传子:主要通过props来实现
具体实现:父组件通过import引入子组件,并注册,在子组件标签上添加要传递的属性,子组件通过props接收,接收有两种形式一是通过数组形式[‘要接收的属性’ ],二是通过对象形式{ }来接收,对象形式可以设置要传递的数据类型和默认值,而数组只是简单的接收
- props: {
- areaId: {
- type: String,
- default: "2"
- },
- isFullScreen: {
- type: Boolean,
- default: ""
- }
- }
第二种:子传父:主要通过$emit来实现
具体实现:子组件通过通过绑定事件触发函数,在其中设置this.$emit(‘要派发的自定义事件’,要传递的值),$emit中有两个参数一是要派发的自定义事件,第二个参数是要传递的值然后父组件中,在这个子组件身上@派发的自定义事件,绑定事件触发的methods中的方法接受的默认值,就是传递过来的参数
- // 子组件部分
- this.$emit("closeDia",false);
-
- // 父组件引入
- <InspectionDialog
- v-if="dialogVisible"
- @closeDialog="closeDialog"
- ></InspectionDialog>
-
- closeDialog() {
- this.dialogVisible = false;
- }
第三种:兄弟之间传值有两种方法:
方法一:通过event bus实现
具体实现:创建一个空的vue并暴露出去,这个作为公共的bus,即当作两个组件的桥梁,在两个兄弟组件中分别引入刚才创建的bus,在组件A中通过bus.$emit(’自定义事件名’,要发送的值)发送数据,在组件B中通过bus.$on(‘自定义事件名‘,function(v) { //v即为要接收的值 })接收数据
- //组件A
- methods:{
- addList:function(){
- //重点: $emit自定义事件
- eventBus.$emit('add',this.todoList)
- }
- }
-
- //组件B
- methods:{
- acceptList:function(){
- // 重点:$on接收事件
- eventBus.$on('add',(message)=>{
- this.lists.push({ name:message,isFinish:false })
- })
- }
- }
-
方法二:通过vuex实现
具体实现:vuex是一个状态管理工具,主要解决大中型复杂项目的数据共享问题,主要包括state,actions,mutations,getters和modules 5个要素,主要流程:组件通过dispatch到 actions,actions是异步操作,再actions中通过commit到mutations,mutations再通过逻辑操作改变state,从而同步到组件,更新其数据状态
共同点: 都是观察页面数据变化的
为什么要清除浮动,因为浮动的盒子脱离标准流,如果父盒子没有设置高度的话,下面的盒子就会上来 解决的方法有很多,主要目的是让父级元素有高度
- .clearfix:after{
- content:".";/*加一段内容*/
- display:block;/*让生成的元素以块级元素显示,占满剩余空间*/
- height:0;/*避免生成的内容破坏原有布局高度*/
- clear:both;/*清除浮动*/
- visibility:hidden;/*让生成的内容不可见*/
- }
- .clearfix{zoom:1;/*为IE6,7的兼容性设置*/}
- font-size: 12px;
- transform : scale(.833);
- -ms-transform: scale(.833);
- -moz-transform: scale(.833);
- -webkit-transform: scale(.833);
- -o-transform: scale(.833);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。