无法将组件呈现到页面

时间:2018-12-30 21:40:21

标签: javascript reactjs

render()方法有问题-我的组件未呈现到页面。您能帮我解决这个问题吗?

这是页面的外观https://imgur.com/a/y3AfxMT

这是我CodePen的链接

整个代码:

// Lists of activities and restrictions
const optionsList = ['Science Lab','Swimming','Cooking','Painting'];
const checkList = [{id: 'a', text:'Dietary Restrictions'},
                   {id: 'b', text:'Physical Disabilities'},
                   {id: 'b', text:'Medical Needs'}]
// First Name and LastName component
function NameInput(props){
  return (
    <div>
      <label>{props.label}</label>
      <br/>
      <input type ='text' value={props.value} onChange={props.handleChange} />
    </div>
  )
}
// List of activities component
function SelectList(props){
  return (
    <div>
      <label>{props.label}</label>
      <br/>
      <select value={props.value} onChange={props.handleChange}>
        {props.optionsList.map( (item, index) =>
            <option key={index} value = {item}> {item} </option>)}
      </select>  
    </div>
  )
}
// CheckBox list component
function CheckBox(props){
   return (
     <p>
       <label>{props.value}) {props.label}</label>
       <input type="checkbox" name={props.name} id={props.id} value={props.value} checked={props.checked} onChange={props.handleChange} />
     </p>
   )
}
// CheckbBoxList component
function CheckBoxList(props){
  return (
    <div>
      <label>{props.title}</label>
      <ol>
        {props.checkList.map((item,index) =>
          <CheckBox 
            key = {index}
            id = {props.id+'_'+index}
            name = {props.id}
            value = {item.id}
            checked = {(props.applyList.indexOf(item.id) < 0 ? false : true)}
            label = {item.text}
            handleChange = {props.handleChange}
           />)
         }
      </ol>
    </div>
  )
}
// Remove button component
function RemoveButton(props){
  return (
    <button onClick= {() => props.handleClick()}>x</button>
  )
}
// Report element
function ReportElem(props){
  return (
    <tbody>
    {props.reportElem.map((item, index) => 
      <tr key={index}>
        <td><RemoveButton /></td>
        <td>{item.firstName}</td> 
        <td>{item.lastName}</td>
        <td>{item.activity}</td>
        <td>{item.apply}</td> 
      </tr>
    )}
    </tbody>
  )
}
// Report table
function ReportTable(props){
  return (
    <table>
      <thead>
        <tr>
          <th>Remove</th>
          <th>First Name</th>
          <th>Last Name</th>
          <th>Activity</th>
          <th>Restrictions</th>
        </tr>
      </thead>
      <ReportElem reportList = {props.reportList} />
    </table>
  )
}

class App extends React.Component{
  constructor(props){
    super(props)
    this.state = {
      firstName: '',
      lastName: '',
      activity: this.props.optionList[0],
      apply: [],
      items: []
    }
  }
  // Handle multiple inputs
  handleChange(event){
    this.setState({[event.target.name]: event.target.value})
  }
  // Handle CheckList changes
  handleChangeChk(event){
    let itemsCopy = this.state.apply
    if (event.target.chacked){
      itemsCopy.push(event.target.value)
    } else {
      console.log(itemsCopy.indexOf(event.target.value))
      itemsCopy.splice(itemsCopy.indexOf(event.target.value), 1)
    }
    this.setState({apply: itemsCopy})
  }
  // Add new item to the report and refresh the initial state
  addItem(){
    let itemsCopy = this.state.items
    itemsCopy.push({
      firstName: this.state.firstName,
      lastName: this.state.lastName,
      activity: this.state.activity,
      apply: this.state.apply.join(',')
    })
    this.setState({
      firstName: '', 
      lastName: '',
      activity: this.props.optionList[0],
      apply: [],
      items: itemsCopy
    })
  }


  render(){
    return (
      <div>
        <NameInput label = 'First Name' value = {this.state.firstName} handleChange = {this.handleChange.bind(this)} />
        <NameInput label = 'Last Name' value = {this.state.lastName} handleChange = {this.handleChange.bind(this)} />
        <SelectList label = 'Select Activity' optionsList={this.props.optionsList} value = {this.state.activity} handleChange = {this.handleChange.bind(this)} />
        <CheckBoxList title = {'Check all that apply'} applyList = {this.state.apply} handleChange = {this.handleChangeChk.bind(this)} />
        <button className = 'submit' onClick = {() => this.addItem()}>Submit</button>
        {this.state.items.length > 0 && <ReportTable reportList = {this.state.items} />}
      </div>
    )
  }
}

ReactDOM.render(
   <App optionsList={optionsList} checkList={checkList}/>,
    document.getElementById('root')
)

1 个答案:

答案 0 :(得分:1)

问题是您将optionList定义为optionsList,且带有's'。

const optionsList = ['Science Lab','Swimming','Cooking','Painting'];

ReactDOM.render(
   <App optionList={optionList} checkList={checkList}/>,
    document.getElementById('root')
)

因此,将optionsList更改为optionList

const optionsList = ['Science Lab','Swimming','Cooking','Painting'];

在这里:

// List of activities component
function SelectList(props){
  return (
    <div>
      <label>{props.label}</label>
      <br/>
      <select value={props.value} onChange={props.handleChange}>
        {props.optionsList.map( (item, index) =>
            <option key={index} value = {item}> {item} </option>)}
      </select>  
    </div>
  )
}