Reactjs 如何使用React.js为其他列表重用具有添加/删除功能的列表组件
我在重用React中具有添加/删除/编辑/保存功能的组件时遇到问题 列表的功能基本上类似于待办事项列表。但是,我想列出几个单独的类别。每个类别应存储数据,以制作数据图表。(我将其存储为Reactjs 如何使用React.js为其他列表重用具有添加/删除功能的列表组件,reactjs,Reactjs,我在重用React中具有添加/删除/编辑/保存功能的组件时遇到问题 列表的功能基本上类似于待办事项列表。但是,我想列出几个单独的类别。每个类别应存储数据,以制作数据图表。(我将其存储为this.state.questionItem.length 我制作了一个橙色标题的列表。我想制作一个蓝色和红色的列表 const questionItem = [ { item : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
this.state.questionItem.length
我制作了一个橙色标题的列表。我想制作一个蓝色和红色的列表
const questionItem = [ { item : 'Lorem ipsum dolor sit amet,
consectetur adipiscing elit, sed do eiusmod tempor?', id : 1
},
{ item : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit,
sed do eiusmod tempor?', id : 2
},
{ item : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit,
sed do eiusmod tempor?', id : 3
},
{ item : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit,
sed do eiusmod tempor?', id : 4
}
]
class CreateItem extends React.Component {
constructor(props){
super(props);
this.state={
modal : false,
open: false
};
this.toggle = this.toggle.bind(this);
}
toggle() {
this.setState({
modal: !this.state.modal
});
}
handleOpen = () => {
this.setState({open: true});
};
handleClose = () => {
this.setState({open: false});
};
handleCreate(e) {
e.preventDefault();
if(!this.refs.newItemInput.value) {
alert('enter a question');
return;
} else if (this.props.questionItem.map(element=> element.item).indexOf(this.refs.newItemInput.value) != -1
) {
alert('This question already exist');
this.refs.newItemInput.value = '';
return;
}
this.props.createItem(this.refs.newItemInput.value);
this.refs.newItemInput.value = '';
}
render() {
return(
<div className="createNew">
<p> Add new ? </p>
<div className="addSample" onClick={this.handleOpen}><img src={Add} className="add" alt="add"/></div>
<Dialog
title="Add a new question"
modal={false}
open={this.state.open}
onRequestClose={this.handleClose}
>
<form onSubmit={this.handleCreate.bind(this)} >
<input type="text" placeholder="New Question" ref="newItemInput" />
<button onClick={this.handleClose}>Submit</button>
</form>
</Dialog>
</div>
);
}
}
class QuestionItem extends React.Component {
constructor(props){
super(props);
this.state ={
editing: false,
open: false,
popOver:false
};
this.toggle = this.toggle.bind(this);
}
handleOpen = () => {
this.setState({open: true});
};
handleClose = () => {
this.setState({open: false});
};
handleTouchTap = (event) => {
// This prevents ghost click.
event.preventDefault();
this.setState({
popOver: true,
anchorEl: event.currentTarget,
});
};
handleRequestClose = () => {
this.setState({
popOver: false,
});
};
toggle() {
this.setState({
modal: !this.state.modal
});
console.log(this.state.modal)
}
onEditClick(){
this.setState({
editing:true
})
}
onCancelClick(){
this.setState({
editing: false
})
}
onSaveClick(e){
e.preventDefault();
this.props.saveItem(this.props.item, this.refs.editInput.value);
this.setState({ editing: false });
}
renderName() {
const itemStyle = {
'text-decoration' : this.props.completed ? 'line-through' : 'none',
cursor : 'pointer'
};
if(this.state.editing) {
return (
<form onSubmit={this.onSaveClick.bind(this)}>
<input type="text" ref="editInput" defaultValue={this.props.item} />
</form>
);
}
return(
<span style={itemStyle}>
{this.props.id} {this.props.item}</span>);
}
renderButtons() {
if(this.state.editing) {
return (
<span>
<div className="saveSample" onClick={this.onSaveClick.bind(this)}><img src={Check} className="edit" alt="edit"/></div>
<div className="cancelSample" onClick={this.onCancelClick.bind(this)}><img src={Fail} className="edit" alt="edit"/></div>
</span>
);
}
return(
<span>
<div className="editSample" onClick={this.onEditClick.bind(this)} onClick={this.handleOpen}><img src={Edit} className="edit" alt="edit"/></div>
<div className="trashbinSample" onClick={this.props.deleteItem.bind(this, this.props.item)}><img src={Trashbin} className="trashbin" alt="Trashbin"/></div>
<div className="dotmenuquestionSample"><img src={Dotmenu} alt="Dotmenu" className="Dotmenu" onClick={this.handleTouchTap} /> </div>
</span>
)
}
render() {
return(
<div className="questionItem">
<span className="name">
{this.renderName()}
</span>
<span className="actions">
{this.renderButtons()}
</span>
<Dialog
title="Edit a question"
modal={false}
open={this.state.open}
onRequestClose={this.handleClose}
>
<form onSubmit={this.onSaveClick.bind(this)}>
<input type="text" ref="editInput" defaultValue={this.props.item} />
<button className="modalButton" onClick={this.handleClose}>Submit</button>
</form>
</Dialog>
<Popover
zDepth={5}
open={this.state.popOver}
anchorEl={this.state.anchorEl}
anchorOrigin={{horizontal: 'right', vertical: 'bottom'}}
targetOrigin={{horizontal: 'left', vertical: 'top'}}
onRequestClose={this.handleRequestClose}
>
<Menu>
<MenuItem primaryText="Item1" />
<MenuItem primaryText="Item2" />
<MenuItem primaryText="Item3" />
<MenuItem primaryText="Item4" />
</Menu>
</Popover>
</div>
);
}
}
class QuestionList extends React.Component {
renderItems() {
return this.props.questionItem.map((item, index) => <QuestionItem
key={index} {...item} {...this.props} />);
}
render() {
return (
<div className="item-list">
{this.renderItems()}
</div>
);
}
}
export default class List extends React.Component {
constructor(props){
super(props);
this.state={
questionItem,
pieData : [{label: "question1", value: 4}, {label: "question2",
value: 10}, {label: "question3", value: 25 },{label:
"question4", value: 5 },{label: "question5", value: 12 }]
}
}
createItem(item){
this.state.questionItem.unshift({
item : item,
});
let length1 = questionItem.length;
var array = [
{label : "question1" ,value : length1 },
{label : "question2" , value : length1 },
{label : "question3" , value : length1 },
{label : "question4" , value : length1 },
{label : "question5" , value : length1 } ]
this.setState({
questionItem : this.state.questionItem,
pieData : array
});
}
findItem(item) {
return this.state.questionItem.filter((element) => element.item ===
item)[0];
}
toggleComplete(item){
let selectedItem = this.findItem(item);
selectedItem.completed = !selectedItem.completed;
this.setState({ questionItem : this.state.questionItem });
}
saveItem(oldItem, newItem) {
let selectedItem = this.findItem(oldItem);
selectedItem.item = newItem;
let length1 = questionItem.length;
var array = [
{label : "question1" ,value : length1 },
{label : "question2" , value : length1 },
{label : "question3" , value : length1 },
{label : "question4" , value : length1 },
{label : "question5" , value : length1 } ]
this.setState({ questionItem : this.state.questionItem,
pieData : array });
}
deleteItem(item) {
let index = this.state.questionItem.map(element =>
element.item).indexOf(item);
this.state.questionItem.splice(index, 1);
let length1 = questionItem.length;
var array = [
{label : "question1" ,value : length1 },
{label : "question2" , value : length1 },
{label : "question3" , value : length1 },
{label : "question4" , value : length1 },
{label : "question5" , value : length1 } ]
this.setState({ questionItem : this.state.questionItem,
pieData : array
});
}
render() {
const { questionItem } = this.state
return (
<div>
<DataChart data = { this.state.pieData} />
<div className="list" style={{"display" : "flex"}}>
<div className="titleElement" style={{"flex": "1", "backgroundColor" : "orange"}}>Advice + FAQ </div>
<div style={{"flex": "5", "display": "flex", "flex-direction": "column"}}>
<QuestionList questionItem={this.state.questionItem} deleteItem={this.deleteItem.bind(this)} saveItem={this.saveItem.bind(this)} toggleComplete={this.toggleComplete.bind(this)} />
<CreateItem questionItem={this.state.questionItem} createItem={this.createItem.bind(this)} />
</div>
</div>
</div>);
}
}
class DataChart extends React.Component {
render(){
var PieChart = rd3.PieChart
var pieData = [{label: "question1", value: 4}, {label: "question2", value: 10}, {label: "question3", value: 25 },{label: "question4", value: 5 },{label: "question5", value: 12 }];
return (
<PieChart
data={this.props.data}
width={450}
height={400}
radius={110}
innerRadius={20}
sectorBorderColor="white"
title="Pie Chart" />
)}
}
const questionItem=[{item:'Lorem ipsum door sit amet,
行政长官,临时行政长官,身份证:1
},
{项目:'Lorem ipsum dolor sit amet,奉献精英,
sed-do-eiusmod-tempor?,id:2
},
{项目:'Lorem ipsum dolor sit amet,奉献精英,
sed-do-eiusmod-tempor?,id:3
},
{项目:'Lorem ipsum dolor sit amet,奉献精英,
sed-do-eiusmod-tempor?,id:4
}
]
类CreateItem扩展了React.Component{
建造师(道具){
超级(道具);
这个州={
莫代尔:错,
开放:假
};
this.toggle=this.toggle.bind(this);
}
切换(){
这是我的国家({
模态:!this.state.modal
});
}
handleOpen=()=>{
this.setState({open:true});
};
handleClose=()=>{
this.setState({open:false});
};
handleCreate(e){
e、 预防默认值();
如果(!this.refs.newItemInput.value){
警告(“输入问题”);
返回;
}else if(this.props.questionItem.map(element=>element.item).indexOf(this.refs.newItemInput.value)!=-1
) {
警报(“此问题已存在”);
this.refs.newItemInput.value='';
返回;
}
this.props.createItem(this.refs.newItemInput.value);
this.refs.newItemInput.value='';
}
render(){
返回(
添加新的
提交
);
}
}
类QuestionItem扩展了React.Component{
建造师(道具){
超级(道具);
这个州={
编辑:错,
开:错,
爆米花:错
};
this.toggle=this.toggle.bind(this);
}
handleOpen=()=>{
this.setState({open:true});
};
handleClose=()=>{
this.setState({open:false});
};
handleTouchTap=(事件)=>{
//这可以防止鬼点击。
event.preventDefault();
这是我的国家({
波弗:没错,
主持人:event.currentTarget,
});
};
HandlerRequestClose=()=>{
这是我的国家({
爆米花:错,
});
};
切换(){
这是我的国家({
模态:!this.state.modal
});
console.log(this.state.modal)
}
onEditClick(){
这是我的国家({
编辑:对
})
}
onCancelClick(){
这是我的国家({
编辑:假
})
}
onSaveClick(e){
e、 预防默认值();
this.props.saveItem(this.props.item、this.refs.editInput.value);
this.setState({editing:false});
}
renderName(){
const itemStyle={
“文本装饰”:this.props.completed?“行到”:“无”,
光标:“指针”
};
if(this.state.editing){
返回(
);
}
返回(
{this.props.id}{this.props.item});
}
renderButtons(){
if(this.state.editing){
返回(
);
}
返回(
)
}
render(){
返回(
{this.renderName()}
{this.renderButtons()}
提交
);
}
}
类问题列表扩展了React.Component{
renderItems(){
返回此.props.questionItem.map((项目,索引)=>);
}
render(){
返回(
{this.renderItems()}
);
}
}
导出默认类列表扩展React.Component{
建造师(道具){
超级(道具);
这个州={
问题项,
pieData:[{标签:“问题1”,值:4},{标签:“问题2”,
数值:10},{标签:“问题3”,数值:25},{标签:
“问题4”,值:5},{标签:“问题5”,值:12}]
}
}
createItem(项目){
this.state.questionItem.unshift({
项目:项目,,
});
让length1=questionItem.length;
变量数组=[
{标签:“问题1”,值:length1},
{标签:“问题2”,值:length1},
{标签:“问题3”,值:length1},
{标签:“问题4”,值:length1},
{标签:“问题5”,值:length1}]
这是我的国家({
questionItem:this.state.questionItem,
pieData:数组
});
}
findItem(项目){
返回此.state.questionItem.filter((元素)=>element.item==
项目)[0];
}
切换完成(项目){
让selectedItem=this.findItem(项目);
selectedItem.completed=!selectedItem.completed;
this.setState({questionItem:this.state.questionItem});
}
保存项(旧项、新项){
让selectedItem=this.findItem(oldItem);
选择editem.item=newItem;
让length1=questionItem.length;
变量数组=[
{标签:“问题1”,值:length1},
{标签:“问题2”,值:length1},
{标签:“问题3”,值:length1},
{标签:“问题4”,值:length1},
{标签:“问题5”,值:length1}]
this.setState({questionItem:this.state.questionItem,
pieData:array});
}
删除项目(项目){
让index=this.state.questionItem.map(元素=>
元素。项目)。索引(项目);
this.state.questionItem.splice(索引1);
让length1=questionItem.length;
变量数组=[
{标签:“问题1”,值:length1},
{标签:“问题2”,值:length1},
{标签:“问题3”,值:length1},
{标签:“问题4”,值:length1},
{标签:“问题5”,值:length1}]
此.setState({questionItem: