javascript - 在动态创建的 React 组件上设置自定义 Prop

标签 javascript reactjs

我正在重构我的一些 React 代码,以便在我不能直接使用 Babel 的地方使用方便(例如页面上的嵌入式 JavaScript)。为了帮助解决这个问题,我正在设置一个简短的函数来构建组件并将 Prop 传递给它们。这段代码工作得很好:

components.js:

import ResponsiveMenu from './components/responsive-menu';
window.setupMenu = (items, ele) => {
  ReactDOM.render(<ResponsiveMenu items={items}/>, ele);
}; 

static-js.html:

<div id="menu"></div>
<script>
   setupMenu({ items: [] }, document.getElementById('menu');
</script>

但是,当我尝试将它变成更通用的东西来处理更多组件时,如下所示:

components.js:

import ResponsiveMenu from './components/responsive-menu';
import AnotherComp from './components/another-comp';

window.setupComponent = (selector, name, props) => {
  let eles;

  if (typeof selector == 'string') {
    eles = [];
    let nl = document.querySelectorAll(selector), node;
    for (let i = 0; node = nl[i]; i++) { eles.push(node); }
  } else {
    eles = $.toArray(selector); // A helper function that converts any value to an array.
  }

  return eles.map (
    (ele) => {
      let passProps = typeof props == 'function' ? props(ele) : props;
      return ReactDOM.render(React.createElement(name, passProps), ele);
    }
  );
};

static-js.html:

<div id="menu"></div>
<script>
   setupComponent('#menu', 'ResponsiveMenu', { items: [] });
</script>

然后我得到这个错误:Warning: Unknown prop "items" on <ResponsiveMenu> tag. Remove this prop from the element. For details, see (really unhelpful shortened link that SO doesn't want me posting)

请帮助我理解为什么这适用于 JSX 版本而不适用于创建组件的更多手动版本。

最佳答案

当您将字符串参数传递给 React.createElement 时,它将创建原生 DOM 元素并且没有有效的 html DOM ResponsiveMenu

您可以将元素存储到散列中并将其存储到window 变量中。

例子:

// store component into window variable
window.components = {
     ResponsiveMenu: ResponsiveMenu
}

//extract component from window variable by name
React.createElement(window.components[name], passProps)

关于javascript - 在动态创建的 React 组件上设置自定义 Prop ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40371886/

相关文章:

javascript - 如何在两个var为true后添加+1

javascript - 对象数组的自定义排序顺序

javascript - Meteor afQuickField 与 onfocus 找不到功能

javascript - JS 双感叹号——有什么好的理由使用它吗?

javascript - react 路由器索引路由始终处于事件状态

javascript - React-Router/Redux - 动态同构路由

javascript - 从 Firefox 4 开始,正则表达式抛出 ""Regular expression too complex"错误

reactjs - React-router-dom 中的 Router 与 Route 有何不同

ios - 如何在 React Native 中检查/更改 iOS 版本?

javascript - 为什么我的底部子组件显示在页面顶部?