Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 如何使用React.js为其他列表重用具有添加/删除功能的列表组件_Reactjs - Fatal编程技术网

Reactjs 如何使用React.js为其他列表重用具有添加/删除功能的列表组件

Reactjs 如何使用React.js为其他列表重用具有添加/删除功能的列表组件,reactjs,Reactjs,我在重用React中具有添加/删除/编辑/保存功能的组件时遇到问题 列表的功能基本上类似于待办事项列表。但是,我想列出几个单独的类别。每个类别应存储数据,以制作数据图表。(我将其存储为this.state.questionItem.length 我制作了一个橙色标题的列表。我想制作一个蓝色和红色的列表 const questionItem = [ { item : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do

我在重用React中具有添加/删除/编辑/保存功能的组件时遇到问题

列表的功能基本上类似于待办事项列表。但是,我想列出几个单独的类别。每个类别应存储数据,以制作数据图表。(我将其存储为
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: