react基础(二)

dom节点引用,双向绑定,组件,todoList简易案例

1.dom节点引用

非受控表单

import{createRef}from 'react'
this.inpRef=createRef()
 <input type="text" ref={this.tempRef} /> 

this.inpRef.current获取节点

2.表单双向绑定

受控表单

  <input value={this.state.msg} />

代码详情

import React, { Component,createRef } from 'react';

class App extends Component {
    constructor(props) {
        super(props);
        this.state = { 
            msg:"你好react"
         }
        // 创建一个dom引用
        this.inpRef = createRef();
    }
    getVal=()=>{
        // 获取表单值
        alert(this.inpRef.current.value);
    }
    changeMsg= (e)=>{
        this.setState({msg:e.target.value})
    }
    render() { 
        return ( <div>
            {/* 受控表单-表单双向绑定 */}
            <p>{this.state.msg}</p>
            <input type="text" value={this.state.msg} onChange={this.changeMsg}/><br />
            <input type="text" value={this.state.msg} onChange={this.changeMsg.bind(this)}/><br />
            <input type="text" value={this.state.msg} onChange={e=>this.changeMsg(e)}/>
            <br />
            {/* 非受控表单 */}
            <input type="text" ref={this.inpRef} />
            <button onClick={this.getVal}>获取值</button>
        </div> );
    }
}
 
export default App;

3.组件

引入图片:

import logo from './logo.svg';

创建组件:

// 一个函数就是就是一个 函数名称是大写 (函数类)
// props参数是单向数据流,是只读
function User(props){
    return <div>
        <div className="avatar">
            <img src={props.item.avatar} alt="" width="80" />
        </div>
        <div>{props.item.name}</div>
        <hr />
    </div>
}
// 默认参数
User.defaultProps = {item:{name:"游客",avatar:logo}}

使用:

<User item={{name:"名字",avatar:logo}}></User>
<User></User>

4.类组件

一个类就是一个组件(class类)

class Produce extends Component {
    constructor(props) {
        super(props);
        this.state = {}
    }
    render() {
        return (<div>
            <div>商品图片</div>
            <div>商品的名称</div>
            <div>商品的价格</div>
            <hr />
        </div>);
    }
}

使用:

<Produce></Produce>

5.todoList

import React, { Component,createRef } from 'react';
class App extends Component {
    constructor(props) {
        super(props);
        this.state = { 
            list:[
                {title:"学习vue",done:true},
                {title:"学习react",done:false},
            ]
         }
        //  创建一个dom引用
        this.tempRef = createRef();
    }
    delItem=item=>{
        // 缓存list
        var  list = this.state.list;
        // 查找下标
        var ind =list.findIndex(value=>value.title==item.title);
        // 删除
        list.splice(ind,1);
        // 更新(setState才会触发视图的更新)
        this.setState({list});

    }
    addItem = ()=>{
        // 缓存list
        var  list = this.state.list;
        // 缓存input
        var inp = this.tempRef.current;
        // 添加
        list.unshift({title:inp.value,done:false});
        // 更新视图
        this.setState({list});
        // 清除input内容
        inp.value = '';

    }
    checkItem = item=>{
         // 缓存list
         var  list = this.state.list;
         // 查找下标
         var ind =list.findIndex(value=>value.title==item.title);
        //  值去反
         list[ind].done = !list[ind].done;
        // 更新视图
        this.setState({list});

    }
    render() { 
        return ( <div>
            <input type="text" ref={this.tempRef} />
            <button onClick={this.addItem}>添加</button>
            <h3>正在进行 {this.state.list.filter(item=>!item.done).length}</h3>

            {
                this.state.list.filter(item=>!item.done).map(item=><div className='item' key={item.title}>
                    <input type="checkbox" checked={item.done} onChange={this.checkItem.bind(this,item)} />
                    <span>{item.title}</span>
                    <button onClick={this.delItem.bind(this,item)}>x</button>
                </div>)
            }
              <h3>已经完 {this.state.list.filter(item=>item.done).length}</h3>
            {
                this.state.list.filter(item=>item.done).map(item=><div className='item' key={item.title}>
                    <input type="checkbox" checked={item.done} onChange={this.checkItem.bind(this,item)} />
                    <span>{item.title}</span>
                    <button onClick={this.delItem.bind(this,item)}>x</button>
                </div>)
            }
        </div> );
    }
}
 
export default App;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值