保存React组件

时间:2017-08-22 16:19:49

标签: javascript mongodb reactjs

我有一个"容器"反应含有其他反应成分的成分。我想保存"容器"组件(及其子组件)在mongodb中然后从那里获取它。 最佳做法是什么?(用户将在容器中添加和编辑这些组件)

2 个答案:

答案 0 :(得分:1)

有很多方法可以实现这一目标。根据您的描述,我会想象制作一个“描述”组件状态的JSON。这个结构可以取决于你,但我做了类似的事情:

{
  title: 'Foo',
  children: [{
    title: 'c1',
    component: 'Header,
    description: 'c1 description'
  }, { 
    title: 'c2',
    component: 'Article,
    description: 'c2 description'
  }]
}

刚刚创建了自定义渲染方法来动态填充子项。

编辑:我向孩子们添加了component。这允许您识别要使用的组件。在渲染之前,您需要创建一些将此字符串转换为对实际组件的引用的内容。示例如下:

const fromMongo = {
  title: 'Foo',
  children: [{
    title: 'c1',
    component: 'Header',
    description: 'c1 description'
  }, { 
    title: 'c2',
    component: 'Article',
    description: 'c2 description'
  }]
}

const Header = p => (
  <header>{p.title}</header>
)
const Article = p => (
  <article>{p.title}</article>
)

const components = {
  Header,
  Article,
}

class App extends React.Component {
  componentWillMount () {
    fromMongo.children.map(d => (
      d.component = components[d.component]
    ))
  }
  render () {
    return (
      <div>
        {fromMongo.children.map(d => (
          <d.component title={d.title} />
        ))}
      </div>
    )
  }
}

ReactDOM.render(
  <App/>,
  document.getElementById('app')
)
header {
 background-color: blue;
}

article {
  background-color: orange;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id='app'></div>

答案 1 :(得分:0)

您可以查看:react-pstate,然后找出一种将您的网络服务用作存储空间的方法......

https://github.com/mgechev/react-pstate目前使用localStorage ...

另一种方法可能是使用一些渲染......

看看这个:

https://www.npmjs.com/package/react-test-renderer

const ReactTestRenderer = require('react-test-renderer');

const renderer = ReactTestRenderer.create(
  <Link page="https://www.facebook.com/">Facebook</Link>
);

console.log(renderer.toJSON());
// { type: 'a',
//   props: { href: 'https://www.facebook.com/' },
//   children: [ 'Facebook' ] }