将函数传递给孩子

alf*_*ino 1 polymer-3.x lit-element

代码非常简单:我尝试将函数addContactFn()MainCompto传递给SideMenu。单击时出现错误

未捕获的类型错误:this.value.handleEvent 不是函数

class MainComp extends LitElement {
    constructor(){
        super()
        this.addContactFn = this.addContactFn.bind(this)
    }
    addContactFn() {
        console.log("clicked");
    }
    render(){
        return html`
<div class="main-page">
   <side-menu addContactFn="${this.addContactFn}"></side-menu>
</div>
`
    }

}


class SideMenu extends LitElement {
    constructor(){
        super()
    }
    static get properties(){
        return {
            addContactFn: Function
        }
    }
    render(){
        return html`<a @click="${this.addContactFn}">Add contact</a>`
    }

}
Run Code Online (Sandbox Code Playgroud)

Ala*_*los 5

正如 Thad 所说,属性总是字符串,并没有真正安全有效的方法来解析执行中的函数

但是,您甚至不需要使用它,只需将函数作为属性而不是属性传递即可,这应该就足够了,之后 MainComp 的渲染将如何结束

render(){
  return html`
    <div class="main-page">
     <side-menu .addContactFn="${this.addContactFn}"></side-menu>
    </div>
    `;
}
Run Code Online (Sandbox Code Playgroud)

基本上,您只需在属性名称前添加一个点

有关更多信息,请查看LitElement 的指南

再说一次,这种做事的方式非常 React,并不真正推荐用于 Web 组件,您可能应该只在子组件中创建一个发出自定义事件并在父组件中拾取它

  • @alfredopacino 属性是在html中设置的,它们只能是字符串,属性是js对象的一部分,所以它们几乎可以是任何东西,litelement的静态属性getter所做的是为你创建属性和属性之间的映射,以便处理两者之间的同步更容易 (2认同)