JSX语法细节补充
1. 如何在jsx中添加注释
render方法return出来的东西就是jsx
import React from 'react';
import { Component, Fragment } from 'react'
class TodoList extends Component{
render(){
return (
<Fragment>
{/*这是一个input框*/}
{
//这是一个input框
}
<input type="text" />
</Fragment>
)
}
}
export default TodoList;
2. className
<input type="text" className="input"/>
动态添加class:
<div className={this.state.active?'active':''}/></div>
3. 不转义
转义,原样输出<h1>hello</h1>
不转义输出 header h1 的hello
dangerouslySetInnerHTML={{__html:item}}
: 外层{} 表示的是里面是一个js表达式,内层的{}表示传入的是一个js对象
import React from 'react';
import { Component, Fragment } from 'react'
class TodoList extends Component{
constructor(props){
super(props)
this.state={
inputValue:"",
list:[]
}
}
render(){
return (
<Fragment>
<input
type="text"
value={this.state.inputValue}
onChange={this.handleInputChange.bind(this)}
/> <button onClick={this.handleButtonClick.bind(this)}>提交</button>
<ul>
{
this.state.list.map((item,index)=>{
return <li
key={index}
onClick={this.handleItemDelete.bind(this,index)}
dangerouslySetInnerHTML={{__html:item}}
>
</li>
})
}
</ul>
</Fragment>
)
}
handleInputChange(e){
this.setState({
inputValue:e.target.value
// list:[list...,e.target.value]
})
}
handleButtonClick(){
this.setState({
list:[...this.state.list,this.state.inputValue],
//...this.state.list es6展开运算符。a=[1,2,3], ...a 它会吧a展开为 1,2,3
inputValue:""
})
}
handleItemDelete(index){
const list = [...this.state.list];//先拷贝一份
//this.state.list.splice(index,1) 这种写法是错误的
//react有一个概念叫inmutable:state不允许我们做任何的改变,如果非要改,我们可以拷贝一个副本
list.splice(index,1)
this.setState({
list:list
})
}
}
export default TodoList;
4. label的htmlFor
在html中label用于扩大点击区域
import React from 'react';
import { Component, Fragment } from 'react'
class TodoList extends Component{
render(){
return (
<Fragment>
<label htmlFor="insertValue">请输入内容:</label>
<input id="insertValue" type="text"/>
</Fragment>
)
}
}
export default TodoList;
当我们点击请输入内容
的时候,光标会自动个聚焦到id为insertValue
的input框上