【问题标题】:Using React and Web Components使用 React 和 Web 组件
【发布时间】:2016-05-04 11:35:33
【问题描述】:

在我们的项目中,我们使用 React 和 Web 组件来开发可重用的 UI 组件(这些组件又将被内部的各种开发团队使用)。组件在 React 中开发并通过 Web 组件注册为自定义 HTML 元素。我们需要一种方法来定义 HTML 自定义标签中的 props 并访问我们的 React 组件中的所有 props。

HTML 会是这样的

<custom-element props1='pageInfo' props2='mediaInfo'></custom-element>

pageInfomediaInfo 将是 JS 对象,它们将在全局窗口范围内声明,或者它们可以在其他命名空间/对象内,在这种情况下,HTML 将类似于

<custom-element props1='NS.pageInfo' props2='NS.mediaInfo'></custom-element>

<custom-element props1='NS.Page.pageInfo' props2='NS.Media.mediaInfo'></custom-element>

因此,我们需要一种方法来获取 HTML 中定义的所有道具并将它们解析为对象并将其传递给ReactDOM.render

目前渲染和注册自定义元素的代码是,

class RegComponent extends HTMLElement {
    constructor() {
        super();
    }
    createdCallback() {
        ReactDOM.render(<App props1={eval(this.getAttributes('props1'))}/>, this);
    }
}
document.registerElement('custom-element', RegComponent);

我们想摆脱 eval 并且所有声明的 props 都应该从 HTML 中获取并传递给ReactDOM.render。寻找类似的东西,

ReactDOM.render(<App {getAllProps()}/>, this);

getAllProps() 应返回所有道具名称及其值。请记住,我使用的是 ES6。任何帮助将不胜感激!

【问题讨论】:

  • 嘿@Aleem,我们也在尝试将 React 组件渲染为 Web 组件,并按照您的方式进行,但我们缺少一件事:CSS。您如何编写 CSS 以便将其集成到您的 Web 组件中?
  • @Lukas 我们在 SASS 中编写样式,使用 Webpack 转译并捆绑到单独的 CSS 文件中。您还可以尝试“样式化组件”、“镭”等。
  • 你可以以此为指导,也可以使用 @falsarella 回答关于使用 JS 而不是 JSX
  • 有人在这方面取得进展吗?

标签: javascript html reactjs ecmascript-6 web-component


【解决方案1】:

不使用 JSX 怎么样:

ReactDOM.render(<App props1={eval(this.getAttributes('props1'))}/>, this);

直接使用 React,通过适配器将属性转换为 props:

ReactDOM.render(React.createElement(App, {...getAllProps(this.attributes)}), this);

function getAllProps(attributes) {
    var props = {};
    for (var i = 0; i < attributes.length; i++) {
        props[attributes[i].nodeName] = attributes[i].nodeValue;
    }
    return props;
}

【讨论】:

【解决方案2】:

如果getAllProps() 返回一个对象,并且对象中的每个属性都是您想要的道具,您只需更新您的渲染以使用扩展运算符(...)。这将解构您的对象,以便将每个属性作为prop 传递给App

这是它的样子:

ReactDOM.render(&lt;App {...getAllProps()}/&gt;, this);

【讨论】:

  • 我同意扩展运算符,但这里的主要问题实际上是如何实现getAllProps(),而不是如何使用它。
猜你喜欢
  • 2018-02-09
  • 2016-09-22
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
相关资源
最近更新 更多