React学习笔记(2.0)
React事件绑定
语法:在对应标签上书写on+事件(比如onClick,onChange),注意和原生的事件区分,React的事件首字母要大写。
const handleChange=(e:any)=>{
console.log(e);
console.log('change事件触发');
// e不是原生事件
//e.nativeEvent是原生事件
}
const App = () => {
let list=['1','2','3'];
// for(let i=0;i<list.length;i++){
// list[i]=<li>{list[i]}</li>
// }
const myClass = ['box1', 'box2']
const myClass2 = classNames({
box1:true,
box2:true,
[style.box5]:true
})
return (
<>
<div>
<div className={myClass.join(' ')}>App</div>
<div style={{color:"purple",fontWeight:900}}>App2</div>
<div className={myClass2}> hello world!</div>
<button onClick={handleClick}>click me</button>
<button onClick={handleClick2(123)}>click me2</button>
<button onClick={(e)=>handleClick3(456,e)}>click me3</button>
<input type="text" onChange={handleChange} placeholder='请输入内容' />
{list.map((item,index) => <li key={index}>{item}</li>)}
</div>
<div></div>
</>
)
}
export default App
这里的e就是一个类似原生的事件e,并不是真正的原生事件e,如果要使用原生事件e,需要使用 e.nativeEvent。
如果要传递自定义参数,需要进行以下修改:
const handleChange=(e:any,name:string)=>{
console.log(e.target.value);
console.log('传递过来的参数',name);
// e不是原生事件
//e.nativeEvent是原生事件
}
const App = () => {
let list=['1','2','3'];
// for(let i=0;i<list.length;i++){
// list[i]=<li>{list[i]}</li>
// }
const myClass = ['box1', 'box2']
const myClass2 = classNames({
box1:true,
box2:true,
[style.box5]:true
})
return (
<>
<div>
<div className={myClass.join(' ')}>App</div>
<div style={{color:"purple",fontWeight:900}}>App2</div>
<div className={myClass2}> hello world!</div>
<button onClick={handleClick}>click me</button>
<button onClick={handleClick2(123)}>click me2</button>
<button onClick={(e)=>handleClick3(456,e)}>click me3</button>
<input type="text" onChange={()=>handleChange(event,'jack')} placeholder='请输入内容' />
{list.map((item,index) => <li key={index}>{item}</li>)}
</div>
<div></div>
</>
)
}
export default App
<input type="text" onChange={(e)=>handleChange(e,'jack')} placeholder='请输入内容' />
注意形参和实参的顺序。
组件
概念:一个组件就是用户界面的一部分,他可以有自己的逻辑和外观,组件之间可以相互嵌套,也可以复用多次。
在React中,一个组件就是首字母大写的函数,内部存放了组件的逻辑和视图UI,渲染组件只需要把组件当成标签书写即可。
首先,新建一个组件button.tsx
然后引入使用:
import Button from './components/button'
return (
<>
<div>
<div className={myClass.join(' ')}>App</div>
<div style={{color:"purple",fontWeight:900}}>App2</div>
<div className={myClass2}> hello world!</div>
<button onClick={handleClick}>click me</button>
<button onClick={handleClick2(123)}>click me2</button>
<button onClick={(e)=>handleClick3(456,e)}>click me3</button>
<input type="text" onChange={(e)=>handleChange(e,'jack')} placeholder='请输入内容' />
{list.map((item,index) => <li key={index}>{item}</li>)}
<Button></Button>
</div>
<div></div>
</>
)
}
useState的使用
useState是一个React Hook(函数),他允许我们向组件添加一个状态变量,从而控制影响组件的渲染结果。
本质:和普通JS变量不同的是,状态变量一旦发生变化组件的视图UI也会跟着发生变化(数据驱动视图),可以类比与vue中的响应式。
const [count,setCount]=useState(0)
//useState是一个函数,返回值是一个数组
//数组中的第一个参数是状态变量,第二个参数是set函数用来修改状态变量
//useState的参数将作为count的初始值
//useState实现一个计数器按钮
const [count,setCount] = React.useState(0)
const handleClick4=()=>{
setCount(count+1)
console.log('click',count);
}
return (
<>
<div>
<div className={myClass.join(' ')}>App</div>
<div style={{color:"purple",fontWeight:900}}>App2</div>
<div className={myClass2}> hello world!</div>
<button onClick={handleClick}>click me</button>
<button onClick={handleClick2(123)}>click me2</button>
<button onClick={(e)=>handleClick3(456,e)}>click me3</button>
<input type="text" onChange={(e)=>handleChange(e,'jack')} placeholder='请输入内容' />
{list.map((item,index) => <li key={index}>{item}</li>)}
<Button></Button>
<button onClick={handleClick4}>加一</button>
<div>{count}</div>
</div>
<div></div>
</>
)
}
状态不可变
在React中,状态被认为是制度的,我们应该始终替换它而不是修改它,直接修改状态不能引发视图更新。
比如上面中修改count的值不能直接使用count++,而是使用setCount(count+1)来修改count的值。
对象修改状态
const [form ,setForm]=useState({
name:'mez',
age:18
})
const handleClick5=()=>{
setForm({
...form,
name:'jack'
})
}
return (
<>
<div>
<div className={myClass.join(' ')}>App</div>
<div style={{color:"purple",fontWeight:900}}>App2</div>
<div className={myClass2}> hello world!</div>
<button onClick={handleClick}>click me</button>
<button onClick={handleClick2(123)}>click me2</button>
<button onClick={(e)=>handleClick3(456,e)}>click me3</button>
<input type="text" onChange={(e)=>handleChange(e,'jack')} placeholder='请输入内容' />
{list.map((item,index) => <li key={index}>{item}</li>)}
<Button></Button>
<button onClick={handleClick4}>加一</button>
<button onClick={handleClick5}>修改对象</button>
<div>{count}--{form.name}</div>
</div>
<div></div>
</>
)
}
export default App
注意:不能使用form.name进行直接修改!
基础样式控制
React组件基础的样式控制有两种方式
1.行内样式(不推荐)
<div style={{color:'blue'}}>哈哈</div>
2.class类名控制样式
在css文件中定义样式,然后在引入使用
.box{
color:'blue'
}
<div className="box">哈哈</div>