Arrays 如何使我的代码成为可重用组件?

Arrays 如何使我的代码成为可重用组件?,arrays,reactjs,components,Arrays,Reactjs,Components,下面是我的代码。我想重构它,使之成为一个可重用的组件,但不知道如何开始。我怎么做?非常感谢您的回答。Lorem ipsum dolor sit amet,是一位杰出的献身者。毛里斯拍卖人马萨·尼西、金丝雀、乌拉库斯湖、弗林利亚ac精英、秃鹫权杖马萨 import React, { useState } from 'react'; import { Link } from 'react-router-dom'; import './styles.css'; const Commitment =

下面是我的代码。我想重构它,使之成为一个可重用的组件,但不知道如何开始。我怎么做?非常感谢您的回答。Lorem ipsum dolor sit amet,是一位杰出的献身者。毛里斯拍卖人马萨·尼西、金丝雀、乌拉库斯湖、弗林利亚ac精英、秃鹫权杖马萨

import React, { useState } from 'react';
import { Link } from 'react-router-dom';
import './styles.css';

const Commitment = () => {

    const [ fields, setFields ] = useState([{ value: "" }]);

    function handleChange(key, event) {
        const values = [...fields];
        values[key].value = event.target.value;
        setFields(values);
    }


    function handleAdd() {
        const values = [...fields];
        values.push({ value: "" });
        setFields(values);
    }

    function handleRemove(key) {
        const values = [...fields];
        values.splice(key, 1)
        setFields(values);
    }

    return (
        <div className="container">
            <div className="row">
                <div className="col-md-12 col-page">
                    <h1 className="page-heading">Create Your KLC</h1> 
                    <p>Make a commitment about something that you will commit to working on in this area:</p>
                </div>
                <div className="col-md-12"> 
                    <form id="form-commitment">
                        <div className="form-group">
                            <p className="form-label">My Commitment <i className="icon-help"></i></p>                       
                        </div>                      
                        {
                            fields.map((field, i) => {
                                return (
                                    <div key={`${field}-${i}`} className="form-group text-dynamic-inputs">
                                        <i className="icon-dynamic-inputs-counter">{i + 1}</i>
                                        <input 
                                            type="text" 
                                            className="form-control" 
                                            value={field.value}
                                            placeholder="Enter the text"
                                            onChange={e => handleChange(i, e)}
                                        />
                                        <button type="button" className="btn-remove" style={{ display: i === 0 && "none"}} onClick={() => handleRemove(i)}>
                                        </button>   
                                    </div>
                                );
                            })
                        }                                                                                       
                    </form>
                    <i className="icon-add-new"></i><Link to="#" onClick={() => handleAdd()} className="link-add-new">Add new</Link>  
                </div>
            </div>
        </div>                  
    )
}

export default Commitment;
import React,{useState}来自“React”;
从'react router dom'导入{Link};
导入“./styles.css”;
常量承诺=()=>{
const[fields,setFields]=useState([{value:'}]);
功能手柄更改(键、事件){
常量值=[…字段];
值[key].value=event.target.value;
设置字段(值);
}
函数handleAdd(){
常量值=[…字段];
push({value:});
设置字段(值);
}
功能手柄移动(键){
常量值=[…字段];
值。拼接(图例1)
设置字段(值);
}
返回(
创建您的KLC
对你将致力于这一领域的工作做出承诺:

我的承诺 { fields.map((字段,i)=>{ 返回( {i+1} handleChange(i,e)} /> handleRemove(i)}> ); }) } handleAdd()}className=“link add new”>add new ) } 出口违约承诺;


`

让我们先把巨大的组件分解成更小的哑组件

通过查看您的代码,看起来像
页面标题
表单承诺
,在表单内部,
字段
似乎可以是转储组件,
icon add new
也可以是转储组件,所以让我们先将它们分开,然后将代码移动到适当的组件

PageHeading

export const PageHeading= props => (
<div className="col-md-12 col-page">
    <h1 className="page-heading">Create Your KLC</h1> 
    <p>Make a commitment about something that you will commit to working on in this 
   area:</p>
  </div>
 );
);

字段
这样的组件

export const FormCommitment = props => (
<div className="col-md-12">
<form id="form-commitment">
  <div className="form-group">
    <p className="form-label">
      My Commitment <i className="icon-help"></i>
    </p>

    {props.children()}
  </div>
</form>
export const Field = props => (
<div className="form-group text-dynamic-inputs">
<i className="icon-dynamic-inputs-counter">{i + 1}</i>
<input
  type="text"
  className="form-control"
  value={props.field.value}
  placeholder="Enter the text"
  onChange={e => props.handleChange(i, e)}
/>
<button
  type="button"
  className="btn-remove"
  style={{ display: props.index === 0 && "none" }}
  onClick={() => props.handleRemove(i)}
   ></button>
  </div>
 );
export const Field=props=>(
{i+1}
道具.手变(i,e)}
/>
道具.把手移动(i)}
>
);
现在出现了重构后看起来像这样的智能组件

<Container>
<PageHeading />
<FormCommitment>
    {fields.map(field, index) => (
        <FormField 
            onChange= {handleChange} 
            onRemove= {handleRemove}  
            key={`${field}-${index}`} 
            index= {index}
            field= {field}
        />
    )}
  </FormCommitment>
  <AddNew  onChange = {handleAdd}/>
</Container>

{fields.map(字段,索引)=>(
)}

希望这会有帮助

通过道具传递数据,并定义类似于单击父级的处理程序。就是这样。@tarzenchugh将您的代码拆分为多个文件,比如将数据从父组件传递到子组件,并在子组件内部进行迭代。