🌰

  • 例如你在星巴克点了咖啡,此时你并不需要在吧台坐等,你只需要回到位子上玩手机,等咖啡好了服务员会叫你。不光叫你,其他人的咖啡好了,服务员也会叫他们来取
  • DOM事件,注册完之后就不用管了,什么时候事件触发了,就会执行里面的code
  • 生命周期图示

    演示

    ```typescript // 主题 class Subject { private state: number = 0 private observers: Observer[] = []

    getState(): number { return this.state }

    setState(newState: number): void { this.state = newState; this.notify(); }

    attach(observer: Observer): void { this.observers.push(observer); }

    private notify() { this.observers.forEach(observer => {

    1. observer.update(this.state);

    }) } }

// 观察者 class Observer { name: string constructor(name: string) { this.name = name; } update(state: number) { console.log(观察者${this.name}接到了通知,内容是${state}) } }

const sub = new Subject(); const observer_1 = new Observer(‘A’); const observer_2 = new Observer(‘B’);

sub.attach(observer_1); sub.attach(observer_2); sub.setState(20);

// 执行结果 // ‘观察者A接到了通知,内容是20’ // ‘观察者B接到了通知,内容是20’

  1. ![](https://cdn.nlark.com/yuque/0/2022/jpeg/1670861/1656868896728-9833117e-60b2-437a-80db-ed7baa0c688f.jpeg)<br />**是否符合设计原则**
  2. - Observe Subject 分离,解耦
  3. - Observer 可以自由扩展
  4. - Subject 可自由扩展
  5. <a name="A8Geh"></a>
  6. # 场景
  7. - DOM 事件
  8. - Vue React 组件生命周期
  9. - Vue watch
  10. - Vue 组件更新过程
  11. - 各种异步回调
  12. - MutationObserve
  13. <a name="qToS4"></a>
  14. ## DOM 事件
  15. ```html
  16. <button id="btn1">btn</button>
  17. <script>
  18. const $btn1 = $('#btn1');
  19. $btn1.click(function () {
  20. console.log(1);
  21. })
  22. $btn1.click(function() {
  23. console.log(2);
  24. })
  25. </script>

vue watch

  1. {
  2. data() {
  3. name: '双越',
  4. info: {
  5. city: 'BeiJing'
  6. }
  7. },
  8. watch: {
  9. name(newVal, val) {
  10. console.log(newVal, val);
  11. },
  12. // 或者
  13. name: {
  14. handler(newVal, val){
  15. console.log(newVal, val);
  16. },
  17. immediate: true // 初始化就会触发
  18. },
  19. info: {
  20. handler(newVal, val) {
  21. console.log(newVal, val);
  22. },
  23. deep: true // 深度监听
  24. }
  25. },
  26. methods: {
  27. changeName() {
  28. this.name = '双越.name' + new Date().getTime();
  29. }
  30. }
  31. }
  1. <script setup>
  2. import { ref, watch, watchEffect, reactive } from 'vue';
  3. const nameRef = ref('双越');
  4. const state = reactive({info: { city: '北京' }})
  5. watch([nameRef], (newVals, vals) => {
  6. console.log('name', newVals, vals);
  7. });
  8. watch(() => state, () => {
  9. console.log(state.info.city)
  10. }, {
  11. deep: true
  12. })
  13. watchEffect(() => { // 会立即触发
  14. console.log(nameRef.value)
  15. })
  16. function changeName() {
  17. nameRef.value = Date.now();
  18. }
  19. </script>
  20. <template>
  21. <p>name: {{ nameRef }}</p>
  22. <button @click="changeName">change name</button>
  23. </template>

Vue 组件更新过程

image.png

各种异步回调函数

  • 定时器 setTimeout setInterval
  • Promise.then
  • Nodejs - stream readline httpServer