React的学习(2)

上节学了父组件向子组件中传值用props,这次练习感觉最关键的还是在react中子组件向父组件传值,用子组件调用父组件函数的形式来实现。

点击按钮实现添加数据

值得注意的接个点:
1.unshift接收的是数组长度,改变了原数组,直接用就好了不需要a=这种去赋值
2.点击完按钮清空input,这里不能newTodo=‘’,涉及深克隆问题,想了下,因为控制input的是value,而不是newTodo
在这里插入图片描述

//定义组件
    class App extends React.Component{
      constructor(props){
        super(props)
        //初始化数据
        this.state = {
          todos: ['吃饭', '睡觉', '打豆豆']
        }
        this.add = this.add.bind(this)
      }
      add(newTodo){
        console.log(newTodo)
        //更新状态
        let todos = this.state.todos
        todos.unshift(newTodo)
        this.setState({
          todos
        })
      }
      render(){
        let {todos} = this.state
        return(
          <div>
            <h2>Simple TODO List</h2>
            <AddTodo add={this.add} todos={todos}/>
            <TodoList todos={todos}/>
          </div>
        )
      }
    }
    //定义AddTodo
    class AddTodo extends React.Component{
      constructor(props){
        super(props)
        this.addTodo = this.addTodo.bind(this)
      }
      addTodo(){
        //收集数据
        let newTodo = this.refs.newTodo.value
        //判断是否输入合法
        if(!newTodo.trim()){
          alert('不能为空')
          return
        }
        this.props.add(newTodo)
        this.refs.newTodo.value = ''
      }
      render(){
        return(
          <div>
            <input ref='newTodo' type="text"/>
            <button onClick={this.addTodo}>Add{this.props.todos.length}</button>
          </div>
        )
      }
    }
    //定义TodoList
    class TodoList extends React.Component{
      render(){
        let {todos} = this.props
        return(
          <ul>
            {
              todos.map((item, index) => {
                return <li key={index}>{item}</li>
            })
            }
            
          </ul>
        )
      }
    }
    ReactDOM.render(<App/>, document.getElementById('example'))

props与state的区别

props只能去读,state可以改变
props中数据是组件外传来的,state是组件内部初始化的数据,私有的

受控组件

react虽然是一个单向数据流,但是我们可以通过state去控制组件,去达到双向数据的显示效果,这种叫受控组件

可以跟随输入框输入变化显示
这里我想让输入框没有值下面的p标签显示‘’请输入‘’,弄了半天逻辑错了。。低级错误,我写这样可能有点麻烦,但是看看后面学习中人家怎么做的吧
注意的是这里的onChange,在键盘按下的一刻就会触发

  class TowWay extends React.Component{
      constructor(props){
          super(props)
          this.state = {
              msg: '',
              show: true
          }
          this.handleChange = this.handleChange.bind(this)
      }
      handleChange(event){
        if(event.target.value.trim()){
              this.setState({
              msg: event.target.value,
              show: false
              })
          }else{
            this.setState({
              msg: event.target.value,
              show: true
          }) 
          }    
          console.log(event.target.value)
      }
      render(){
          let {msg, show} = this.state
          return(
              <div>
                <input onChange={this.handleChange} type="text" />
                <p>{show? '请输入':msg}</p>
              </div>
          )
      }
  }
  ReactDOM.render(<TowWay/>, document.getElementById('example'))

下午继续!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值