【问题标题】:How to pass callback function to litelement from React?如何将回调函数从 React 传递给 litelement?
【发布时间】:2019-06-19 16:47:42
【问题描述】:

我正在尝试在我的 React 项目中使用 lit-element 组件,我想将回调函数从 React 传递给 lit-element 组件,但没有成功。

我尝试了几种不同的方法,比如更改属性类型,以及将函数作为字符串传递,但它们都不起作用。

lit-element 组件代码:

import { LitElement, html } from "lit-element";

class MyButton extends LitElement {
  static get properties() {
    return {
      clickHandler: {
        type: String
      },
      bar: {
        type: String
      }
    };
  }

  render() {
    const foo = this.clickHandler; //value is undefined
    const bar = this.bar; //value is "it's bar"
    return html`
      <button @click=${this.clickHandler}>click me</button>
    `;
  }
}

customElements.define("my-button", MyButton);

反应端代码:

<my-button clickHandler={() => alert("clicked")} bar="it's bar" />

我在组件的渲染部分放了一个断点,我可以看到'bar'值正确传入,但是'clickHandler'的值是未定义的。

有人知道如何将函数从 React 传递到 lit-element 吗?

谢谢!

【问题讨论】:

  • 每当我的按钮组件被渲染时它是否显示警报“点击”?

标签: javascript reactjs polymer lit-element


【解决方案1】:

查看https://github.com/Polymer/pwa-starter-kit/blob/template-no-redux/src/components/my-app.js 的 no redux pwa-starter-kit 的菜单按钮单击功能。我相信这提供了可能对您有用的示例。

【讨论】:

  • 欢迎来到 SO,最好在您的答案中包含一个示例,而不是直接指向外部链接,因为链接可能会损坏或更新为不相关的内容。
【解决方案2】:

我发现可行的方法是在 react 组件中添加一个 ref 到 lit 元素,然后在其上设置属性。

所以,对于以下 JSX:

<some-webcomponent ref={this.myRef}></some-webcomponent>

您可以将属性传递给“some-webcomponent”,即componentDidMount:

componentDidMount () {
  const element = this.myRef.current;
  element.someCallback = () => // ...
}

它不太漂亮,但我也不会认为它是 hack。虽然需要相当多的样板:/

这是一个完整的 React 组件供参考:

class MyComponent extends React.Component {   
  constructor(props) {     
    super(props);     
    this.myRef = React.createRef();   
  }   

  render() {     
    return <some-webcomponent ref={this.myRef}></some-webcomponent>;   
  } 

  componentDidMount() {
    const element = this.myRef.current;  
    element.someCallback = () => console.log(“call!”);
  }
}

点亮元素在哪里:

import { LitElement, html } from "lit-element";  

class SomeWebcomponent extends LitElement {
   static get properties() {    
     return {       
      someCallback: { type: Function }
     };
   }

   render() {     
     return html`       
       <button @click=${this.someCallback}>click me</button>     
     `;   
    } 
}  

customElements.define("some-webcomponent", SomeWebcomponent);

【讨论】:

  • 尽管它不是 100% hack,但它仍然不是它的设计方式,我相信答案是通过本机事件处理,而不是 ref
【解决方案3】:

这个问题可能不仅仅对反应有效。这很笼统,我如何将处理程序从父组件传递给子组件,无论是 lit-element 还是 html 元素。

根据属性文档,https://lit-element.polymer-project.org/guide/properties

<my-element 
  mystring="hello world"
  mynumber="5"
  mybool
  myobj='{"stuff":"hi"}'
  myarray='[1,2,3,4]'>
</my-element>

目前似乎不支持(回调)功能。那么Element如何处理来自父级的事件呢?

根据事件文档https://lit-element.polymer-project.org/guide/events,您可以将任何事件分派到 dom 树,包括您的父级。 Dom 事件系统比React 道具系统要广泛得多。

class MyElement extends LitElement {
    ...
    let event = new CustomEvent('my-event', {
      detail: {
        message: 'Something important happened'
      }
    });
    this.dispatchEvent(event);
}

然后在光照或非光照上下文中,使用以下内容来处理事件,

const myElement = document.querySelector('my-element');
myElement.addEventListener('my-event', (e) => {console.log(e)});

这样您就可以允许子级触发父级的实现,这正是回调的定义。

【讨论】:

  • @Steve,很抱歉第一次没有完成我的解决方案。我编辑了我的帖子,现在它应该解决确切的问题,而不是问题所暗示的。我真的不认为到目前为止其他作者提供的解决方案是解决方案。
猜你喜欢
  • 2013-06-06
  • 1970-01-01
  • 2017-10-03
  • 2013-02-07
  • 1970-01-01
  • 2022-08-02
  • 1970-01-01
  • 2021-01-28
  • 2022-01-25
相关资源
最近更新 更多