是否可以根据Reactjs中的实际布局html来操作组件?
Is it possible to manipulate components based on the actual laid out html in Reactjs?
所以我觉得 React 将成为这项工作的错误工具(因为 React 非常关注单向流程),但我想我会问。
假设我有以下 HTML:
<div class="container">
<div class="module">
<div class="row">First Row</div>
<div class="row">Second Row</div>
<div class="row">Third Row</div>
</div>
</div>
现在说容器class div有一个最大高度,只允许它显示第一行和第二行,导致第三个流溢出。
发生这种情况时,我想将溢出的行移动到一个新的容器中,所以我有以下输出:
<div class="container">
<div class="module">
<div class="row">First Row</div>
<div class="row">Second Row</div>
</div>
</div>
<div class="container">
<div class="module">
<div class="row">Third Row</div>
</div>
</div>
没有 React,我计划通过将我的数据结构传递到 render()
调用中,在第一个代码示例中创建 html,然后遍历每个模块(然后是行)来做到这一点,找出底部像素值是否大于容器的最大高度,如果是,则重新渲染它。
我想在 Reactjs 中做到这一点,通过使每一行成为模块组件内的组件,但我不确定是否可以在 React 中有效地完成此操作。
要使其完全动态,将涉及计算容器的高度,以及在放置时逐行的总高度。当行的总高度超过容器的高度时,我们就知道有多少行适合一个容器,并且可以根据需要渲染尽可能多的容器,每个容器都有它可以处理的最大行数。
这可以在顶级(有状态)组件上使用回调来完成,此回调会向下传递到处理呈现各个行的组件,并在行组件安装后调用。回调然后进行所需的计算,然后使用新值更新应用程序的状态,指示每个容器要呈现的最大行数。
以下是其工作原理的粗略概述:
var App = React.createClass({
getInitialState: function(){
return {
rowsToPlace: 1,
maxRowsPerContainer: 1,
calculateRows: true
}
},
cb: function(){
// passed down to Row component, handles calculating container/row heights
// updates state as required
},
render: function(){
// use state to incrementally render rows in to a single container
// until we know how many fit
return(
<div ClassName="app">
{containersToRender}
</div>
);
}
});
var Container = React.createClass({
render: function(){
return(
<div className="container">
<div ClassName="module">
{this.props.rows.map(function(row,i){
return <Row data={row} key={i} cb={this.props.cb} calcRows={this.props.calcRows}/>
}.bind(this))}
</div>
</div>
);
}
});
var Row = React.createClass({
render: function() {
return (
<div className="row">{this.props.data.rowNum}</div>
);
},
componentDidMount: function(){
if(this.props.calcRows) {
this.props.cb();
}
}
});
它不优雅,滥用状态的程度让我感到局促不安,但这是一个非常粗糙的 js fiddle 上面的原型在行动:http://jsfiddle.net/qhuksapm/
更改 CSS 中 .container 的最大高度以进行测试。
至少它应该给你一些可以扩展和完善的东西。
所以我觉得 React 将成为这项工作的错误工具(因为 React 非常关注单向流程),但我想我会问。
假设我有以下 HTML:
<div class="container">
<div class="module">
<div class="row">First Row</div>
<div class="row">Second Row</div>
<div class="row">Third Row</div>
</div>
</div>
现在说容器class div有一个最大高度,只允许它显示第一行和第二行,导致第三个流溢出。
发生这种情况时,我想将溢出的行移动到一个新的容器中,所以我有以下输出:
<div class="container">
<div class="module">
<div class="row">First Row</div>
<div class="row">Second Row</div>
</div>
</div>
<div class="container">
<div class="module">
<div class="row">Third Row</div>
</div>
</div>
没有 React,我计划通过将我的数据结构传递到 render()
调用中,在第一个代码示例中创建 html,然后遍历每个模块(然后是行)来做到这一点,找出底部像素值是否大于容器的最大高度,如果是,则重新渲染它。
我想在 Reactjs 中做到这一点,通过使每一行成为模块组件内的组件,但我不确定是否可以在 React 中有效地完成此操作。
要使其完全动态,将涉及计算容器的高度,以及在放置时逐行的总高度。当行的总高度超过容器的高度时,我们就知道有多少行适合一个容器,并且可以根据需要渲染尽可能多的容器,每个容器都有它可以处理的最大行数。
这可以在顶级(有状态)组件上使用回调来完成,此回调会向下传递到处理呈现各个行的组件,并在行组件安装后调用。回调然后进行所需的计算,然后使用新值更新应用程序的状态,指示每个容器要呈现的最大行数。
以下是其工作原理的粗略概述:
var App = React.createClass({
getInitialState: function(){
return {
rowsToPlace: 1,
maxRowsPerContainer: 1,
calculateRows: true
}
},
cb: function(){
// passed down to Row component, handles calculating container/row heights
// updates state as required
},
render: function(){
// use state to incrementally render rows in to a single container
// until we know how many fit
return(
<div ClassName="app">
{containersToRender}
</div>
);
}
});
var Container = React.createClass({
render: function(){
return(
<div className="container">
<div ClassName="module">
{this.props.rows.map(function(row,i){
return <Row data={row} key={i} cb={this.props.cb} calcRows={this.props.calcRows}/>
}.bind(this))}
</div>
</div>
);
}
});
var Row = React.createClass({
render: function() {
return (
<div className="row">{this.props.data.rowNum}</div>
);
},
componentDidMount: function(){
if(this.props.calcRows) {
this.props.cb();
}
}
});
它不优雅,滥用状态的程度让我感到局促不安,但这是一个非常粗糙的 js fiddle 上面的原型在行动:http://jsfiddle.net/qhuksapm/
更改 CSS 中 .container 的最大高度以进行测试。
至少它应该给你一些可以扩展和完善的东西。