以下纯属笔记,这些技术胖视频有
组件拆分
在src
目录下,新建一个文件,这里就叫做XiaojiejieItem.js
import React, { Component } from 'react'; //imrc class XiaojiejieItem extends Component { //cc render() { return ( <div>小姐姐</div> ); } } export default XiaojiejieItem;
import React,{Component,Fragment } from 'react' import './style.css' import XiaojiejieItem from './XiaojiejieItem' class Xiaojiejie extends Component{ //js的构造函数,由于其他任何函数执行 constructor(props){ super(props) //调用父类的构造函数,固定写法 this.state={ inputValue:'' , // input中的值 list:['基础按摩','精油推背'] //服务列表 } } render(){ return ( <Fragment> {/* 正确注释的写法 */} <div> <label htmlFor="jspang">加入服务:</label> <input id="jspang" className="input" value={this.state.inputValue} onChange={this.inputChange.bind(this)} /> <button onClick={this.addList.bind(this)}> 增加服务 </button> </div> <ul> { this.state.list.map((item,index)=>{ return ( //----------------关键修改代码----start <div> <XiaojiejieItem /> </div> //----------------关键修改代码----end ) }) } </ul> </Fragment> ) } inputChange(e){ // console.log(e.target.value); // this.state.inputValue=e.target.value; this.setState({ inputValue:e.target.value }) } //增加服务的按钮响应方法 addList(){ this.setState({ list:[...this.state.list,this.state.inputValue], inputValue:'' }) } //删除单项服务 deleteItem(index){ let list = this.state.list list.splice(index,1) this.setState({ list:list }) } } export default Xiaojiejie
父组件向子组件传值
使用组件属性的形式父组件给子组件传值。比如:我们在<XiaojiejieItem>
组件中加入content
属性,然后给属性传递{item}
,这样就完成了父组件向子组件传值。
父组件:
<XiaojiejieItem content={item} />
子组件:
import React, { Component } from 'react'; //imrc class XiaojiejieItem extends Component { //cc render() { return ( <div>{this.props.content}</div> ); } } export default XiaojiejieItem;
父组件向子组件传递内容,靠属性的形式传递
子组件向父组件传递数据
现在要作这样一个功能:点击组件中的菜单项后,删除改菜单项。在前边的课程中已经学习了这个知识,知识现在组件拆分了,就涉及了一个字组件向父组件传递数据的知识需要掌握。
先来绑定点击事件,这时候当然是要在XiaojiejieItem
组件中绑定了,代码如下:
子组件:
import React, { Component } from 'react'; //imrc
class XiaojiejieItem extends Component { //cc
//--------------主要代码--------start
constructor(props){
super(props)
this.handleClick=this.handleClick.bind(this)
}
//--------------主要代码--------end
render() {
return (
<div onClick={this.handleClick}>
{this.props.content}
</div>
);
}
handleClick(){
this.props.deleteItem(this.props.index)
}
}
export default XiaojiejieItem;
父组件:
<ul> { this.state.list.map((item,index)=>{ return ( <XiaojiejieItem key={index+item} content={item} index={index} //关键代码-------------------start deleteItem={this.deleteItem.bind(this)} //关键代码-------------------end /> ) }) } </ul>
React的特性中有一个概念叫做“单项数据流”:只读不能改,要想改的话,就得父组件传递修改这个数据的方法给子组件,子组件通过调用父组件的方法来改父组件自己的数据
在父组件向子组件传递数据时,使用了属性的方式,也就是props ,如果没有任何的限制,在工作中时完全不允许的,因为大型项目,如果你不校验,后期会变的异常混乱,业务逻辑也没办法保证
PropTypes的简单应用
我们在Xiaojiejie.js
组件里传递了4个值,有字符串,有数字,有方法,这些都是可以使用PropTypes
限制的。在使用需要先引入PropTypes
。
import PropTypes from 'prop-types'
引入后,就可以在组件的下方进行引用了,需要注意的是子组件的最下面(不是类里边),写入下面的代码:
import React, { Component } from 'react'; //imrc import PropTypes from 'prop-types' class XiaojiejieItem extends Component { //cc constructor(props){ super(props) this.handleClick=this.handleClick.bind(this) } render() { return ( <div onClick={this.handleClick}> {this.props.content} </div> ); } handleClick(){ this.props.deleteItem(this.props.index) } } //--------------主要代码--------start XiaojiejieItem.propTypes={ content:PropTypes.string, deleteItem:PropTypes.func, index:PropTypes.number } //--------------主要代码--------end export default XiaojiejieItem;
### 必传值的校验
avname:PropTypes.string.isRequired
### 使用默认值defaultProps
XiaojiejieItem.defaultProps = { avname:'松岛枫' }