react-小案例,收集表单数据
小案例代码:
<!DOCTYPE html><html lang="en">
<head>
<meta charset="UTF-8">
<title>work7</title>
<script src="../js/react.development.js"></script>
<script src="../js/react-dom.development.js"></script>
<script src="../js/prop-types.js"></script>
<script src="../js/babel.min.js"></script>
<script type="text/babel">
/*
问题1:数据保存哪个组件?
如果数据是某个组件需要,就直接给该组件,如果是某些组件需要,就给共同的父亲
问题2:在子组件中改变父组件的状态?
子组件中不能直接改变父组件的状态
状态在哪个组件更新状态的行为就应该定义在哪个组件
解决方案:父组件定义函数,传递给子组件,子组件调用
组件化编写功能的流程:
1.拆分组件(定义n个组件)
2.实现静态组件(给组件内实现render,没有动态数据,没有交互)
3.实现动态组件
1).实现初始化数据动态显示
2).实现交互功能
*/
class App extends React.Component{
constructor(props){
super(props)
this.state={ //初始化数据
todos:[\'DO\',\'dujingxiu\',\'eee\']
}
this.addTodo=this.addTodo.bind(this)
}
addTodo(todo){ //方法也是一种数据
//更新数据必须更新状态
const {todos}=this.state
todos.unshift(todo)
//更新状态
this.setState({todos})
}
render(){
const {todos}=this.state
return( //return 里面只能有一个根标签
<div>
<h1>Simple TODO List</h1>
<Add count={todos.length} addTodo={this.addTodo}/>
<List todos={todos}/>
</div>
)
}
}
class Add extends React.Component{
constructor(props){
super(props)
this.add=this.add.bind(this)
}
add(){
//1.读取输入的数据
const todo=this.todoinput.value.trim()
//2.检查合法性
if(!todo){ //如果字符串为空
return
}else{
//3.添加内容
this.props.addTodo(todo)
//4.清除输入
this.todoinput.value=\'\'
}
}
render(){
return(
<div>
<input type="text" ref={input=>this.todoinput=input}/>
<button onClick={this.add}>add{this.props.count+1}</button>
</div>
)
}
}
class List extends React.Component{
render(){
const {todos}=this.props
return (
<ul>
{todos.map((todo,index)=><li key={index}>{todo}</li>)}
</ul>
)
}
}
List.propTypes={
todos:PropTypes.array.isRequired
}
Add.propTypes={
count:PropTypes.number.isRequired,
addTodo:PropTypes.func.isRequired
}
ReactDOM.render(<App />,document.getElementById("example"))
</script>
</head>
<body>
<div id="example"></div>
</body>
</html>
收集表单数据:
代码:
<!DOCTYPE html><html lang="en">
<head>
<meta charset="UTF-8">
<title>work8</title>
<script src="../js/react.development.js"></script>
<script src="../js/react-dom.development.js"></script>
<script src="../js/prop-types.js"></script>
<script src="../js/babel.min.js"></script>
<script type="text/babel">
class LoginForm extends React.Component{
constructor(props){
super(props)
this.state={
pwd:\'\'
}
this.handleSubmit=this.handleSubmit.bind(this)
this.handleChange=this.handleChange.bind(this)
}
handleSubmit(event){
//阻止事件的默认行为,这里事件的默认行为是 提交
event.preventDefault()
const name=this.nameInput.value
const {pwd}=this.state
alert(`准备提交的用户名为:${name};密码为:${pwd}`)
}
//onChange事件:这个方法在原生中input的onChange是在失去焦点的时候触发,而在react的onChange是输入内容就会调用方法
handleChange(event){
//读取输入的值
const pwd=event.target.value
//更新pwd的状态
this.setState({pwd})
}
render(){
return(
<form action="/test" onSubmit={this.handleSubmit}>
用户名:<input type="text" ref={input=>this.nameInput=input}/>
密码:<input type="password" value={this.state.pwd} onChange={this.handleChange}/>
<input type="submit" value="登录"/>
</form>
)
}
}
ReactDOM.render(<LoginForm/>,document.getElementById("example"))
</script>
</head>
<body>
<div id="example"></div>
</body>
</html>
包含表单的组件分类:
受控组件:表单项输入数据能自动收集成状态(例如上面的密码框)
非受控组件:需要时才动手读取表单输入框中的数据(例如上面的姓名框)
以上是 react-小案例,收集表单数据 的全部内容, 来源链接: utcz.com/z/383301.html