js处理事件:异步处理事件与线程,使用队列按序执行,事件广播,事件eventBus,事件监听,变量监听,动态执行,父子通信; 同域名下打包部署两个不同的项目如何彼此通信传递消息数据:本地存储 frame 通信 postMessage BroadcastChannel 与监听 addEventListener

js处理事件:异步处理事件与线程,使用队列按序执行,事件广播,事件bus,事件监听,变量监听,动态执行,父子通信

在 Vue 3 中,你可以使用以下方法来处理异步事件、线程、队列执行、事件广播、事件总线、事件监听、变量监听、动态执行和父子通信:

1. 异步处理事件:可以使用 async/awaitPromise 对象来处理异步操作。在 setup() 函数中,你可以使用 await 关键字等待异步操作完成,或返回一个 Promise 对象。

  • Promise.resolve(value): 创建一个已经解决(resolved)的 Promise 对象,它的状态为成功,并返回给定的值 value。
  • Promise.reject(reason): 创建一个已经拒绝(rejected)的 Promise 对象,它的状态为失败,并返回给定的拒绝原因 reason。
下面是一个简单的示例,展示了如何使用 resolve 和 reject 回调函数:

javascript
复制
const promise = new Promise((resolve, reject) => {
  // 异步操作
  const isSuccess = true;

  if (isSuccess) {
    resolve('Operation successful'); // 解决 Promise,传递结果
  } else {
    reject(new Error('Operation failed')); // 拒绝 Promise,传递错误信息
  }
});

promise
  .then((result) => {
    console.log(result); // 在 Promise 解决时执行
  })
  .catch((error) => {
    console.error(error); // 在 Promise 拒绝时执行
  });
在上述示例中,通过 resolve 回调函数将 Promise 对象状态设置为已解决,并传递了 'Operation successful' 作为结果。在 .then() 方法中的回调函数中获取到了这个结果并进行处理。

2. 线程:Vue 3 并不直接支持多线程,但你可以使用 Web Workers 或其他 JavaScript 库来实现多线程操作。Web Workers 是在浏览器中运行在后台线程中的 JavaScript 脚本,可以执行耗时操作而不阻塞主线程。

3. 队列按序执行:你可以使用 JavaScript 中的 Promiseasync/awaitsetTimeout 等机制来按序执行异步任务。通过合理地使用这些机制,你可以确保任务按照期望的顺序执行。

4. 事件广播:你可以使用 Vue 3 中的事件系统来实现事件广播。通过 $emit 方法触发一个事件,并使用 $on 方法在其他组件中监听该事件,从而实现事件的广播和接收。

5. 事件总线:你可以创建一个全局的事件总线来进行组件之间的通信。可以使用一个单独的 Vue 实例作为事件总线,在其中定义事件和监听器,并在需要通信的组件中引入该事件总线。

6. 事件监听:在 Vue 3 中,你可以使用 watch 函数来监听数据的变化。可以监听单个变量或对象的属性,并在变化时执行相应的操作。

7. 变量监听:使用 watch 函数可以监听数据的变化,包括响应式数据、计算属性等。你可以在 setup() 函数中使用 watch 来监听变量,并在变化时执行相应的逻辑。

8. 动态执行:你可以使用 JavaScript 的 eval 函数或 Function 构造函数来动态执行代码字符串。但需要注意,动态执行代码具有一定的安全风险,应谨慎使用。

9. 父子通信:在 Vue 3 中,父子组件之间可以通过属性、事件、provide/inject$refs 等方式进行通信。父组件可以通过属性向子组件传递数据,子组件可以通过 $emit 方法触发事件来通知父组件。还可以使用 provide 在父组件中提供数据,然后在子组件中使用 inject 来获取数据。

请注意,以上提及的方法是常用的 Vue 3 中处理异步事件、线程、队列执行、事件广播、事件总线、事件监听、变量监听、动态执行和父子通信的方式。具体的使用方法可以根据具体需求和场景进行选择和调整。

同域名下打包部署两个不同的项目如何彼此通信传递消息数据

当在同一个域名下打包和部署两个不同的 Vue 3 项目时,可以使用以下方法来实现彼此之间的通信和数据传递:

  1. LocalStorage 或 SessionStorage:使用浏览器的本地存储(LocalStorage 或 SessionStorage)来在两个项目之间传递消息和数据。一个项目可以将数据存储在本地存储中,另一个项目可以监听本地存储的变化来获取数据。

在发送消息的项目中,将数据存储到本地存储中:

// 发送消息的项目
localStorage.setItem('message', 'Hello from Project A');

在接收消息的项目中,监听本地存储的变化来获取数据:

// 接收消息的项目
window.addEventListener('storage', (event) => {
  if (event.key === 'message') {
    console.log('Received message:', event.newValue);
  }
});

请注意,当一个项目修改本地存储中的数据时,其他项目会收到 storage 事件。因此,你需要在接收消息的项目中添加适当的条件来过滤和处理特定的数据。

  1. iframe 通信:使用 <iframe> 元素在两个项目之间建立通信通道。一个项目可以通过向另一个项目的 <iframe> 发送消息,从而实现数据传递。

在发送消息的项目中,使用以下代码与目标项目建立通信:

// 发送消息的项目
const targetWindow = document.getElementById('target-iframe').contentWindow;
targetWindow.postMessage('Hello from Project A', 'https://yourdomain.com');

在接收消息的项目中,使用以下代码监听消息:

// 接收消息的项目
window.addEventListener('message', (event) => {
  if (event.origin === 'https://yourdomain.com') {
    console.log('Received message:', event.data);
  }
});

在发送消息的项目中,target-iframe 是目标项目的 <iframe> 元素的 id。你需要根据实际情况修改它。

  1. 跨域通信方法:使用 postMessage() 方法:postMessage() 是一种在不同窗口之间进行跨域通信的方式。你可以在两个项目中使用 postMessage() 方法来发送和接收消息。
    在发送消息的项目中,使用以下代码:
复制
// 发送消息的项目
window.parent.postMessage('Hello from Project A', 'https://target-domain.com');

在接收消息的项目中,使用以下代码:

复制
// 接收消息的项目
window.addEventListener('message', (event) => {
  if (event.origin === 'https://source-domain.com') {
    console.log('Received message:', event.data);
  }
});

在这个示例中,发送消息的项目使用 window.parent.postMessage() 方法向指定的目标域名发送消息。目标域名需要在接收消息的项目中进行验证,以确保只接收来自指定域名的消息。

  1. URL 参数传递:如果两个子项目之间的通信只涉及简单的数据传递,你可以使用 URL 参数来传递数据。一个子项目可以通过 URL 参数传递数据给另一个子项目,并在接收方解析 URL 参数来获取数据。
    在发送数据的子项目中,使用带有参数的 URL 进行页面跳转:
复制
// Component A
const message = 'Hello from Component A';
window.location.href = 'http://yourdomain.com/component-b?message=' + encodeURIComponent(message);

在接收数据的子项目中,解析 URL 参数来获取数据:

复制
// Component B
const urlParams = new URLSearchParams(window.location.search);
const message = urlParams.get('message');
console.log('Received message in Component B:', message);
  1. new BroadcastChannel():来在同一个域名下的不同项目之间进行跨窗口通信,包括在 Vue 3 中使用。
    ** BroadcastChannel 接口代理了一个命名频道,可以让指定 origin 下的任意 browsing context 来订阅它。它允许同源的不同浏览器窗口,Tab 页,frame 或者 iframe 下的不同文档之间相互通信。通过触发一个 message 事件,消息可以广播到所有监听了该频道的 BroadcastChannel 对象。**

BroadcastChannel 是 HTML5 提供的一个 API,用于在不同窗口或标签页之间进行消息广播。

在发送消息的项目中,你可以使用以下代码:

// 发送消息的项目
const channel = new BroadcastChannel('myChannel');
channel.postMessage('Hello from Project A');

在接收消息的项目中,你可以使用以下代码:

// 接收消息的项目
const channel = new BroadcastChannel('myChannel');
channel.addEventListener('message', (event) => {
  console.log('Received message:', event.data);
});

在这个示例中,两个项目都通过 new BroadcastChannel('myChannel') 创建了一个命名的通道,其中 'myChannel' 是通道的名称。发送消息的项目使用 postMessage() 方法向通道发送消息,而接收消息的项目通过添加 message 事件监听器来接收消息。

需要注意的是,BroadcastChannel API 在某些旧版本的浏览器中不受支持,因此在使用之前请确保目标浏览器支持该 API。
https://developer.mozilla.org/zh-CN/docs/Web/API/BroadcastChannel

使用 new BroadcastChannel() 可以让你在同一域名下的不同项目之间实现简单而强大的跨窗口通信。希望这对你有所帮助!如有其他问题,请随时提问。

这些方法可以帮助你在同一个域名下打包和部署的两个不同 Vue 3 项目之间实现通信和数据传递。选择适合你项目需求的方法,并根据需要进行适当的调整和处理。

平常的addEventListener 监听使用与实时响应 回调处理与报错处理
当使用 addEventListener 在普通的 HTML 元素上进行事件监听时,你可以为特定事件添加回调函数来处理实时响应、回调处理和错误处理。以下是一个示例:

const element = document.getElementById('myElement');

// 监听事件
element.addEventListener('click', (event) => {
  console.log('Clicked!');
  // 在这里可以对点击事件进行实时响应处理
});

// 监听其他事件
element.addEventListener('mouseover', (event) => {
  console.log('Mouse over!');
  // 在这里可以对鼠标悬停事件进行实时响应处理
});

// 监听错误事件(适用于特定事件,如加载图片时的错误)
element.addEventListener('error', (event) => {
  console.error('Error:', event);
  // 在这里可以对错误进行处理,例如显示错误提示或执行特定的错误逻辑
});

在上面的代码中,addEventListener 方法用于为不同事件类型(如 clickmouseover)添加相应的回调函数。当事件被触发时,相应的回调函数将被执行。

在实时响应处理的回调函数中,你可以根据事件类型和事件对象执行任意操作,例如更新页面的内容、执行特定的逻辑或触发其他事件。

在回调函数中,你还可以使用 event 对象来获取事件的相关信息,如触发事件的元素、鼠标位置等。

当事件监听过程中发生错误时,例如加载图片失败时触发的 error 事件,你可以在相应的错误处理回调函数中处理错误。根据事件类型和事件对象,你可以执行适当的错误处理逻辑,例如显示错误消息或执行特定的错误处理操作。

需要注意的是,不同的事件类型支持不同的回调函数参数。你可以根据具体的事件类型和需要传递的信息,来选择使用适当的回调函数参数。

希望这能帮助你理解如何使用 addEventListener 来处理实时响应、回调处理和错误处理!如果你有其他问题,请随时提问。

posted @ 2024-02-02 10:29  yoona-lin  阅读(30)  评论(0编辑  收藏  举报