ref/event和form
使用ref对操作DOM
- ReactDOM.findDOMNode
- this.refs.xxx 获取DOM后可以方便结合现有非 react 类库的使用,通过 ref/refs 可以取得组件实例,进而取得原生节点,不过尽量通过 state/props 更新组件,不要使用该功能去更新组件的DOM。
import React, { Component } from 'react';
import ReactDOM, { findDOMNode } from 'react-dom';
class HandleDOMComponent extends Component {
componentDidMount(){
// 两种方式都可以获取到元素
let ele = findDOMNode(this.refs.content);
let ele2 = this.refs.content;
// 如果想用 jquery,那么这是个好时机
console.log( ele );
console.log( ele.innerHTML );
console.log( ele2.innerHTML );
}
render(){
return (
<div>
<h3>来吧,一起操作DOM</h3>
<div ref='content'>这是我DOM元素里面的内容</div>
</div>
);
}
}
export default HandleDOMComponent;
再看个例子
App.js
class App extends React.Component{
componentDidMount(){
console.log(this.refs.aaa);
$('#btn1').click(function(){
alert('aaa');
})
$('#btn').click(function(){
$('#btn1').trigger('click')
})
console.log(this.newAttr)
this.textInput.focus()
}
render(){
return(
<div>
<div ref={(aaa)=>this.newAttr=aaa} id='test'>aaa</div>
<input text='type' ref={input=>this.textInput=input}/>
<button id='btn' ref='btn' onClick={()=>this.refs.aaa.click()}>我是0</button>
<button id='btn1' onClick={()=>console.log(this.textInput.value)} key={Math.random()}>我是1</button>
<Test ref='aaa'/>
</div>
)
}
}
export default App;
Test.js
import React from 'react';
class Test extends React.Component{
getValue(){
return this.refs.input.value
}
click(){
alert('aaabbb');
}
render(){
return(
<div>
我是测试组件
<input type='text' defaultValue='wshzj' ref='input'/>
<button onClick={this.click.bind(this)}>thtrh</button>
</div>
)
}
}
export default Test;
事件event
可以通过设置原生 dom 组件的 onEventType 属性来监听 dom 事件,例如 onClick, onMouseDown,在加强组件内聚性的同时,避免了传统 html 的全局变量污染
class App extends React.Component{
constructor(){
super();
this.state={
divH:50
}
}
handleWheel(event){
console.log(event.deltaY);
if(this.state.divH<50){
this.setState({divH:100})
}else{
this.setState({divH:this.state.divH+event.deltaY})
}
}
handleMenu(e){
e.preventDefault();
console.log('你点击了右键');
}
render(){
return(
<div style={ {height:`${this.state.divH}px`,backgroundColor:'#ccc'} } onWheel={this.handleWheel.bind(this)}
onContextMenu={this.handleMenu.bind(this)}></div>
</div>
)
}
}
注意:事件回调函数参数为标准化的事件对象,可以不用考虑 IE
使用自定义组件
父组件
class Children extends React.Component{
constructor(){
super();
this.state={
divH:50
}
}
render(){
return(
<div>
王健男
<Son>
<p>sdvfd</p>
<Test/>
</Son>
</div>
)
}
}
子组件
class Son extends React.Component{
render(){
console.log(this.props)
return(
<div>
{this.props.children}
</div>
)
}
}
export default Son;
form表单代码
value值(输入不了了)defaultValue || onChange
有两种:
- 1.受控表单onChange, state控制value
- 2.不受控defaultValue,不可以设置value
class Form extends React.Component{ constructor(){ super() this.state={ inputValue:'', textarea:'', select:'Grapefruit', radio:'male' } } submit(e){ e.preventDefault(); console.log('saaa') } handleChange(e){ console.log(e.target.value); this.setState({inputValue:e.target.value}) } handleText(e){ this.setState({textarea:e.target.value}) } select(){ this.setState({value: event.target.select}); } render(){ return( <div> <form action='http://blog.duopingshidai.com' method='POST' onSubmit={this.submit.bind(this)} > <input type='text' name='phoneNumber' defaultValue='12345'/> <input type='text' name='phoneNumber' value={this.state.inputValue} onChange={this.handleChange.bind(this)}/> <button type='submit'>提交</button> <button type='button'>普通</button>{/*默认普通按钮*/} <button type='reset'>重设</button> <textarea value={this.state.textarea} onChange={this.handleText.bind(this)}/> <textarea value={this.state.textarea} onChange={(e)=>this.setState({textarea:e.target.value})}/> <select value={this.state.select} onChange={this.select.bind(this)}> <option value="grapefruit">Grapefruit</option> <option value="lime">Lime</option> <option value="coconut">Coconut</option> <option value="mango">Mango</option> </select> ) } } export default Form;
单选框,多选框
单选框代码
class Radio extends React.Component{
constructor(){
super()
this.state={
radio:'male'
}
}
render(){
return(
<div>
<input type='radio' name='test'/>男
<input type='radio' name='test' defaultChecked/>女
<br/>
<br/>
<br/>
<input type='radio' name='test1' value='male' checked={this.state.radio==='male'?true:false} onChange={(e)=>this.setState({radio:e.target.value})}/>男
<input type='radio' name='test1' value='famale' checked={this.state.radio==='famale'?true:false} onChange={(e)=>this.setState({radio:e.target.value})}/>女
</div>
)
}
}
export default Radio;
多选框代码
class checked extends React.Component{
constructor(){
super()
this.state={
checkboxValue:[] //创建一个空数组
}
}
handleChange(e){
let ckValue=this.state.checkboxValue;
let nowCheck=e.target.value;
let index=ckValue.findIndex(element=>element===nowCheck) //检索数组里有没有nowCheck
if(index==-1){
ckValue.push(nowCheck) //如果没有就把它放到数组里
}else{
ckValue.splice(index,1) //如果有就把数组里删去
}
this.setState({checkboxValue:ckValue}) //把结果数组的值给checkboxValue
}
render(){
console.log(this.state.checkboxValue);
return(
<div>
<input type='checkbox' value='apple' name='fruits' onChange={this.handleChange.bind(this)}/>苹果
<input type='checkbox' value='banana' name='fruits' onChange={this.handleChange.bind(this)}/>香蕉
<input type='checkbox' value='pear' name='fruits' onChange={this.handleChange.bind(this)}/>梨子
<button>提交</button>
</div>
)
}
}
export default checked;