【发布时间】:2017-09-30 05:59:43
【问题描述】:
我使用 Laravel 5.4 和 React 15.5.4,代码是用 ES6 编写的。
我想替换 Vue 并使用 React,我做到了。但是我经常会在刀片模板的不同地方使用小组件,例如2。我不想使用一个应用组件。
我想使用类似的东西:
<span class="react">
<TestComponent property={true} />
</span>
我不能自动完成。现在我用
<span data-component="TestComponent" data-props="{property:true}" />
在 app.js 中
_.each(document.querySelectorAll('[data-react]'), element => {
let props ={};
Array.prototype.slice.call(element.attributes)
.forEach(item => {
props[item.name] = item.value;
if(item.name !== 'data-react'){
element.removeAttribute(item.name);
}
});
ReactDOM.render(React.createElement(reactComponents[element.getAttribute('data-react')],props),element);
});
它有效,但我需要使用将所有属性添加到一个反应组件属性,然后使用例如this.props.out.propery
我也想在刀片组件中设置普通组件标签
我尝试在 app.js 中使用
_.each(document.querySelectorAll('.react'), item => {
ReactDOM.render(item.children,item);
});
有人有办法解决这个问题吗?
编辑
我将解决方案更改为:
<span data-react="LoginForm" input="{{json(request()->old())}}" error="{{session('error')}}" errors="{{json($errors->getMessages())}}" />
或
<LoginForm data-react="LoginForm" input="{{json(request()->old())}}" error="{{session('error')}}" errors="{{json($errors->getMessages())}}" />
在刀片和resources/assets/js/app.js
var reactComponents = {
LoginForm: require('./components/login').default,
};
_.each(document.querySelectorAll('[data-react]'), element => {
let props ={};
Array.prototype.slice.call(element.attributes)
.forEach(item => {
props[item.name] = item.value;
});
ReactDOM.render(React.createElement(reactComponents[element.getAttribute('data-react')],props),element);
});
它工作正常。这不是超级明确的解决方案,但我认为这是合理的。 我可以在 html 代码中设置组件名称并添加几乎与 JSX 中相同的道具。
【问题讨论】: