我在Laravel项目中使用React js作为前端。从控制器,我将数组传递给我的视图:
return view('shopCart')->with('items',$it);
现在在视图中,a可以循环遍历数组:
@foreach($items as $item)
<li><input type="checkbox" name=""> <span>{{$item->Name}}</span> <span></span> <span>{{$item->Cost}}</span> </li>
@endforeach
这很好用。但我想让视图更具动态性(顺便说一下,这是购物车中的产品列表)。例如,默认情况下,将检查所有复选框,这意味着用户正在购买所有项目。我希望如果用户取消选中一个框,则总价格会发生变化。所以我创建了一个React组件,并通过props将$ items数组传递给该组件:
<div id="listshops" datas={{$items}}></div>
还有组件:
class Items extends Component {
render() {
return (
<div className="container">
<a href="/products">Continue shopping</a>
//LOOP THROUGH THE ARRAY OF PRODUCTS
</div>
);
}
}
export default Items;
window.onload=function(){
if (document.getElementById('listshops')) {
var data=document.getElementById('listshops').getAttribute("datas");
ReactDOM.render(<Items items={data}/>, document.getElementById('listshops'));
}
}
我如何遍历传递给组件的数组,以便我可以像刀片中的@foreach一样显示产品?
答案 0 :(得分:1)
Array#map
,不要“循环”。您将一个数据集(您的产品)映射到另一个相同大小的数据集(React组件)
const { items } = this.props;
return (
<div className="container">
<a href="/products">Continue shopping</a>
{items.map(({ Name, Cost }) => <li key={Name}>
<input type="checkbox" name="" /> <span>{Name}</span> <span></span> <span>{Cost}</span>
</li>)}
</div>
);
通常当你map
时,这是一个很好的迹象,表明你正在使用一个可以重复使用的组件。这可能是一种更清洁的方法:
const Product = ({ Name, Cost }) => (
<li>
<input type="checkbox" name="" />
<span>{Name}</span>
<span></span>
<span>{Cost}</span>
</li>
);
然后在你的渲染中:
const { items } = this.props;
return (
<div className="container">
<a href="/products">Continue shopping</a>
{items.map(({ Name, Cost }) => <Product {...{Name, Cost}}/>}
</div>
);