当前位置: 首页 > 知识库问答 >
问题:

反应用于与父节点通信的js自定义事件

康恩
2023-03-14

我正在制作并侦听普通DOMCustomEvents,以便与父节点通信:

在孩子:

  var moveEvent = new CustomEvent('the-graph-group-move', { 
    detail: {
      nodes: this.props.nodes,
      x: deltaX,
      y: deltaY
    },
    bubbles: true
  });
  this.getDOMNode().dispatchEvent(moveEvent);

在父项中:

componentDidMount: function () {
  this.getDOMNode().addEventListener("the-graph-group-move", this.moveGroup);
},

这是可行的,但是否有更好的具体方法

共有3个答案

权胜泫
2023-03-14

您可以通过上下文传递的回调来冒泡事件:[CodePen]

import * as React from 'react';

const MyEventContext = React.createContext(() => {});

const MyEventBubbleContext = ({children, onMyEvent}) => {
  const bubbleEvent = React.useContext(MyEventContext);
  const handleMyEvent = React.useCallback((...args) => {
    // stop propagation if handler returns false
    if (onMyEvent(...args) !== false) {
      // bubble the event
      bubbleEvent(...args);
    }
  }, [onMyEvent]);
  return (
    <MyEventContext.Provider value={handleMyEvent}>
      {children}
    </MyEventContext.Provider>
  );
};

const MyComponent = () => (
  <MyEventBubbleContext onMyEvent={e => console.log('grandparent got event: ', e)}>
    <MyEventBubbleContext onMyEvent={e => console.log('parent got event: ', e)}>
      <MyEventContext.Consumer>
        {onMyEvent => <button onClick={onMyEvent}>Click me</button>}
      </MyEventContext.Consumer>
    </MyEventBubbleContext>
  </MyEventBubbleContext>
);

export default MyComponent;
松元明
2023-03-14

您可以编写一个简单的服务,然后使用它

/** eventsService */
module.exports = {
  callbacks: {},

  /**
   * @param {string} eventName
   * @param {*} data
   */
  triggerEvent(eventName, data = null) {
    if (this.callbacks[eventName]) {
      Object.keys(this.callbacks[eventName]).forEach((id) => {
        this.callbacks[eventName][id](data);
      });
    }
  },

  /**
   * @param {string} eventName name of event
   * @param {string} id callback identifier
   * @param {Function} callback
   */
  listenEvent(eventName, id, callback) {
    this.callbacks[eventName][id] = callback;
  },

  /**
   * @param {string} eventName name of event
   * @param {string} id callback identifier
   */
  unlistenEvent(eventName, id) {
    delete this.callbacks[eventName][id];
  },
};

示例(触发相同)

import eventsService from '../../../../services/events';
export default class FooterMenu extends Component {
  componentWillMount() {
    eventsService
      .listenEvent('cart', 'footer', this.cartUpdatedListener.bind(this));
  }

  componentWillUnmount() {
    eventsService
      .unlistenEvent('cart', 'footer');
  }

  cartUpdatedListener() {
    console.log('cart updated');
  }
}
孙清野
2023-03-14

React的方法是通过道具将回调明确传递给孩子。React中不支持带有冒泡的自定义事件。

反应性编程抽象是正交的:

通过观察者模式编程交互式系统很困难,而且容易出错,但在许多生产环境中仍然是实现标准。我们提出了一种逐渐反对观察者而支持反应式编程抽象的方法。几个库层帮助程序员将现有代码从回调顺利迁移到更具声明性的编程模型。

React的理念是基于命令模式:

工具书类

  • 弃用观察者模式
 类似资料:
  • 我现在的问题是,我不知道如何从子组件到父组件进行通信,因为一旦用户选择了一种语言,我想用所选的语言更新下拉列表,所以我需要填充方法handleClick来向父组件发送所选的语言并更新它,但我不知道如何做到这一点。到目前为止,我已经试过了,但没有运气 任何帮助都将不胜感激。

  • 我使用Node.js的情况是这样的: 因此,反之亦然。根据要求,我需要从捕获响应头并将其附加到

  • 本文向大家介绍js事件模型与自定义事件实例解析,包括了js事件模型与自定义事件实例解析的使用技巧和注意事项,需要的朋友参考一下 JavaScript 一个最简单的事件模型,需要有事件绑定与触发,还有事件删除。 其中主要实现了bind(绑定事件)、unbind(删除事件)与 trigger (触发事件)。对同一事件名称,可以绑定多个事件处理函数;并按照绑定的顺序依次触发。 args.splice(0

  • 本文向大家介绍Vue.js组件通信之自定义事件详解,包括了Vue.js组件通信之自定义事件详解的使用技巧和注意事项,需要的朋友参考一下 组件通信 从父组件向子组件通信,通过props传递数据就可以了,但Vue组件通信的场景不止有这一种,归纳起来,组件之间的通信可以用下图来表示: 自定义事件 当子组件需要向父组件传递数据时,就要用到自定义事件。子组件用**$ emit()来触发事件**,父组件用**

  • 看看下面的输入JSON: 由具有几种不同实现的接口表示。关键是,为了确定应该使用哪个实现来进行反序列化,我需要检查值。 我目前的解决方案是立即反序列化整个事情: 有人有主意吗?提前道谢!

  • 我一直试图让我的机器人回复用户时,他们的反应机器人表情,但没有运气,我希望有人能帮助我在这里,我只是一个初学者与不和谐。js。 这是我的代码,我只是需要帮助,当用户做出反应时,机器人会发送一条消息回来。