React初始记录(五)

98 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情

默认值

React渲染生命周期时,表单元素上的value将会覆盖DOM节点中的值。在非受控组件中,想让React赋予组件一个初始值,但不去控制后续的更新。可以指定一个defaultValue属性,而不是value。在一个组件已经挂载之后去更新defaultValue属性的值,不会造成DOM上值的任何更新。


  render() {
      return (
          <form onSubmit={this.handleSubmit}>
              <label>
                  姓名:
                  <input type="text" defaultValue="Jake" ref={this.input}></input>
              </label>
              <input type="submit" value="提交"></input>
          </form>
      )
  }

同样,<input type="checkbox">和<input type="radio">支持defaultChecked,<select>和<textarea>支持defaultValue。 文件输入

HTML中,input type="file"可以让用户选择一个或多个文件上传到服务器,或者通过使用File API进行操作。

在React中input type="file"始终是一个非受控组件,因为它的值只能由用户设置,而不能通过代码控制。

可以使用File API与文件进行交互。

class FileInput extends React.Component {

​ constructor(props){

​ super(props);

this.handleSubmit = this.handleSubmit.bind(this);

this.fileInput = React.createRef();

}

handleSubmit(event){

​ event.preventDefault();

​ alert(`xxx-${this.fileInput.current.files[0]}`);

}

render(){

​ return (

​ <form onSubmit={this.handleSubmit}>

​ <label>

​ 上传文件:

​ <input type="file" ref={this.fileInput} />

​ </label>

​ <br />

​ <button type="submit">提交</button>

​ </form>

)

}

}

const root = ReactDOM.createRoot(

​ document.getElementById('root')

)

root.render(<FileInput />);

状态提升

通常,多个组件需要反映相同的变化数据,建议将共享状态提升到最近的共同父组件中去。


function Grade(props){
•    if(props.g>=100){
•        return <p>优秀呀</p>
•    }
•    return <p>不错</p>
}
class App extends React.Component {
  constructor(props) {
•      super(props);
•      this.handleChange = this.handleChange.bind(this);
•      this.state = {f:''};
  }
  handleChange(event){
•    this.setState({f:event.target.value});
}
  render() {
•      const f = this.state.f;
•      return (
•         <fieldset>
•             <legend>请输入成绩</legend>
•             <input type="text" value={f} onChange={this.handleChange}/>
•             <Grade g={f}/>
•         </fieldset>
•      )
  }
}

组合

React有着强大的组合模式,实现组件间的复用,更推荐使用组合

包含关系

父组件想知道子组件的具体内容可以通过使用一个特殊的children prop来将子组件传递到渲染结果中。这样可以使得其他组件通过JSX嵌套,将任意组件作为子组件传递给它们。感觉有点像vue的插槽

function A(props){
    return (
    	<div>{props.children}</div>
    )
}
function B(){
    return(
    	<A>
    		<div>A</div>
    	</A>
    )
}

注意,如果需要预留多个位置,那么就不要使用children,而是将需要的内容传入props,并使用相应的prop

function A(props){
    reutrn(
    	<div className="all">
    		<div>
    			{props.a}
    		</div>
    		<div>
    			{props.b}
    		</div>
    	</div>
    )
}
function B(){
    reutrn(
    	<A>
    		a={
                <C/>
    		}
    		b={
                <D/>
    		}
    	</A>
    )
}

特例关系

有时需要将某些组件看作其他组件的特殊实例

在React中,通过组合来实现,特殊组件可以通过props定制并渲染一般组件

function A(props){
    return (
        <div>
            <div>
                {props.a}
            </div>
            <div>
                {props.b}
            </div>
        </div>
    )
}
function B(){
    reutrn(
        <A a="do something" b="do something" />
    )
}