熟悉 vue 的都知道 方法methods、计算属性computed、观察者watcher 在 Vue 中有着非常重要的作用,有些时候我们实现一个功能的时候可以使用它们中任何一个都是可以的,但是它们之间又存在一些不同之处,每一个都有一些适合自己的场景,我们要想知道合适的场景,肯定先对它们有一个清楚的了解,先看一个小例子。
<div id="app">
<input v-model="firstName" type="text">
<input v-model="secondName" type="text">
<p>{{fullName}}</p>
</div>
var vm = new Vue({
el: "#app",
data: {
firstName: "Mo",
secondName: "deng",
fullName: ""
},
methods: {
getFullName () {
this.fullName = this.firstName + "" + this.secondName;
}
},
mounted () {
this.getFullName();
}
});
var vm = new Vue({
el: "#app",
data: {
firstName: "liu",
secondName: "deng"
},
computed: {
fullName () {
return this.firstName + "" + this.secondName;
}
}
});
var vm = new Vue({
el: "#app",
data: {
firstName: "liu",
secondName: "deng",
fullName: "liudeng"
},
watch: {
firstName: function (value) {
this.fullName = value+ "" + this.secondName
},
secondName: function (value) {
this.fullName = this.firstName + "" + value
}
}
});
我们看到上面三种方法实现一个相同的效果,虽然效果相同,但是我们每个方法之间会有所区别。
在我们使用 Vue 时可能会有很多方法会被放到这里,比如它可能是我们的事件处理方法,一些操作方法的逻辑等等,但是它不能跟踪任何依赖,而且还会在每次组件重新加载时都会执行,这就会导致我们的方法会执行很多次,如果我们的 UI 操作频繁的话,会导致性能的问题,所以在一些开销比较大的计算时,我们应该尝试其他方案进行优化处理。
从名字我们其实大概的可以看出,它是一个依赖于其他属性的,当依赖的属性发生变化的时候就会触发我们计算属性的逻辑,而且是基于它们依赖的属性进行缓存的,也就是说只有当依赖的属性发生变化的时候才会从新求值。
相比 methods 的优势在于不必每次从新执行定义的函数,这给我们的性能上有着很大的优势,对我们已经存在的数据属性非常好的处理方式,例如我们案例中 fullName 的计算,优势非常明显。
当一些数据属性变化时,我们执行一些逻辑时观察者对我们非常重要,它可以帮助我们监听属性的变化,只要属性发生变化,我们就可以执行对应的一些操作。
在 methods 中我们放置了一些事件处理方法,我们可以在事件绑定中直接应用,不会依赖于任何的属性。
<button class="todo-remove" type="button" @click="removeTodoItem(item)">x</button>
export default {
name: "TodoList",
data() {
return {
todoType: "all", //任务类型
allTodoItems: [],
};
},
methods: {
//... 省略
//添加任务
addItem() {
this.allTodoItems.push({
id: this.allTodoItems.length,
text: this.itemText,
completed: false
});
this.itemText = "";
},
//删除任务
removeTodoItem(item) {
this.allTodoItems = this.allTodoItems.filter(
value => value.id != item.id
);
}
}
};
我们可以看到计算属性都是依赖于其他属性的,只有当依赖的属性值发生改变时,我们的计算属性才会发生变化。
例如:passTodoItems 计算属性依赖于 todoType 属性,只要 todoType 属性发生变化,我们的 passTodoItems 也会发生变化,从而筛选出我们需要的数据。
export default {
name: "TodoList",
data() {
return {
todoType: "all", //任务类型
allTodoItems: [],
};
},
computed: {
//展示的任务
passTodoItems() {
return this[this.todoType](this.allTodoItems);
},
//是否显示底部的选项
isShowOptions() {
return this.allTodoItems.length;
}
}
}
可以看到我们利用 watcher 进行数据的存储逻辑操作,只要当我们监听的属性 allTodoItems 发生变化时,我们就把数据进行保存。
export default {
name: "TodoList",
data() {
return {
todoType: "all", //任务类型
allTodoItems: [],
};
},
watch: {
allTodoItems: {
handler() {
localStorage.setItem("todoItems", JSON.stringify(this.allTodoItems));
},
deep: true //深度监听对象属性的变化,如果没有检测不到对象属性的变化
}
}
}
通过一个简单的 TodoList 案例展示了 methods、computed、watcher 三者的用法,当然我们的实战项目中不仅仅是这么简单。
我们再使用 methods、computed、watcher 时,应该选择它们合适的使用场景,虽然它们可以实现相同的结果。
methods 一般定义一些事件处理方法,操作方法,因为会频繁的触发,所以会引起性能问题,一般不会用在操作频繁的地方。
computed 会依赖于其他已经存在的属性,而且会进行缓存,只有在依赖的属性发生变化时,计算属性才会发生改变,开销大的地方使用较多。
watcher 它提供了一个更通用的方法来监听我们的属性,当我们的属性变化是执行一些逻辑的操作。
原文来源:https://www.cnblogs.com/beevesnoodles/archive/2018/10/30/9880024.html
单例模式是我们开发中一个非常典型的设计模式,js单例模式要保证全局只生成唯一实例,提供一个单一的访问入口,单例的对象不同于静态类,我们可以延迟单例对象的初始化,通常这种情况发生在我们需要等待加载创建单例的依赖。
工厂模式下的对象我们不能识别它的类型,由于typeof返回的都是object类型,不知道它是那个对象的实例。另外每次造人时都要创建一个独立的person的对象,会造成代码臃肿的情况。
建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象
主要涉及知识点: HTML与XHTML,HTML与XHTML的区别,DOCTYPE与DTD的概念,DTD的分类以及DOCTYPE的声明方式,标准模式(Standard Mode)和兼容模式(Quircks Mode),标准模式(Standard Mode)和兼容模式(Quircks Mode)的区别
JavaScript中常见的四种设计模式:工厂模式、单例模式、沙箱模式、发布者订阅模式
javascript 策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。 策略模式利用组合,委托等技术和思想,有效的避免很多if条件语句,策略模式提供了开放-封闭原则,使代码更容易理解和扩展, 策略模式中的代码可以复用。
javascript观察者模式又叫发布订阅模式,观察者模式的好处:js观察者模式支持简单的广播通信,自动通知所有已经订阅过的对象。存在一种动态关联,增加了灵活性。目标对象与观察者之间的抽象耦合关系能够单独扩展以及重用。
我觉得聊一下我爱用的 JavaScript 设计模式应该很有意思。我是一步一步才定下来的,经过一段时间从各种来源吸收和适应直到达到一个能提供我所需的灵活性的模式。让我给你看看概览,然后再来看它是怎么形成的
在围绕设计模式的话题中,工厂这个词频繁出现,从 简单工厂 模式到 工厂方法 模式,再到 抽象工厂 模式。工厂名称含义是制造产品的工业场所,应用在面向对象中,顺理成章地成为了比较典型的创建型模式
简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。 比如你去专门卖鼠标的地方你可以买各种各样的鼠标
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!