react从入门到精通2

本文详细介绍了React中获取input输入值、双向绑定、遍历对象与数组、TodoList组件的实现,包括增删改查功能,以及函数组件和类组件的使用。此外,还展示了如何在组件间传递参数,包括父向子和子向父的传参方式。通过实例代码深入理解React组件的交互与状态管理。
摘要由CSDN通过智能技术生成

表单

获取input输入值

页面效果
在这里插入图片描述

import React, { Component, createRef } from 'react';
class App extends Component {
    constructor(props) {
        super(props);
        this.state = {
            msg: '你好'
        }
        this.inRef = createRef()
    }

    getVal = () => {
        //this 指向 Component    inRef 对应的 input     current 固定写法   value input的输入值
        alert(this.inpRef.current.value)
    }
    render() {
        return (<div>
            {/*获取input的value*/}
            <input type="text" ref={this.inRef} />
            <button onClick={this.getVal}>获取value</button>        

        </div>);
    }
}

export default App;

实现双向绑定

在这里插入图片描述

在这里插入图片描述

案例

遍历对象与数组

在这里插入图片描述

import React, { Component } from 'react'
// 类组件
class App extends Component {
    constructor(props) {
        super(props); this.state = {
            list: [{ title: '学习vue', done: true },{ title: "学习react", done: true },{ title: "学习html ", done: true }],
            list2: ["a", "b", 3, 5, 6]
        }
    }
    render() {
        return (
            <div>
                {this.state.list.map(item =>
                    <div className='item' key={item.title}>
                        <span>{item.title}</span>
                    </div>)
                }
                {this.state.list2.map((item, index) =>
                    <div className='item' key={index}>
                        <span>{item}</span>
                    </div>)
                }
            </div>
        );
    }

}
export default App;

todolist

功能:

  • 实现增加
  • 实现删除
  • 实现单选框可以修改
  • 实现input选中添加到已完成,不选中添加到未完成
    页面效果
    在这里插入图片描述
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 = '';

    }
    // item发生变化,更新item
    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>
            {/* filter(item=>!item.done)  filter(item=>item.done) 是为了实现input选中添加到已完成,不选中添加到未完成 */}
            <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;

组件

函数组件与类组件

页面效果
在这里插入图片描述

import React, { Component } from 'react';
class App extends Component {
    constructor(props) {
        super(props);
        this.state = {}
    }
    render() {
    	//使用组件
        return (<div style={{ "padding": "30px" }}>
            <h1>组件</h1>
            <h3>函数组件</h3>
            <User></User>
            <h3>类组件</h3>
            <Produce></Produce>
        </div>);
    }
}

export default App;
//一个函数就是一个组件
//定义函数组件 User组件名(自定义第一个子母大写)
function User(params) {
    return <div>
        <div className='avatar'>头像</div>
        <div>小天</div>
    </div>
}
//定义类组件 Produce组件名(自定义第一个子母大写)
class Produce extends Component {
    constructor(props) {
        super(props);
        this.state = {}
    }
    render() {
        return (<div>
            <div>商品图片</div>
            <div>商品价格</div>
            <div>商品命名</div>
            <div>商品价格</div>
        </div>);
    }
}

组件传递参数

页面效果
在这里插入图片描述

//引入入图片
import logo from './logo.svg';
import h5 from './h5.jpg';

//父组件传递参数
       return (<div style={{ "padding": "30px" }}>
      	<h1>组件</h1>
      	{/*传递参数*/}
      	<User item={{ name: "小明", avatar: logo }}></User>
      	<User item={{ name: "老王", avatar: h5 }}></User>
    </div >);


//子组件接受参数
//  props接收参数  props参数是单向数据流,是只读
function User(props) {
  return <div>   
    <img src={props.item.avatar} alt="" width="80" />   
    <div>{props.item.name}</div>
    <hr />
  </div>
}
// 默认参数
User.defaultProps = { item: { name: "游客", avatar: h5 } }

组件子向父传参

页面效果

import React, { Component } from 'react';
class App extends Component {
  constructor(props) {
    super(props);
    this.state = { color: "red", bgColor: 'yellow' }
  }
  // setColor = v => console.log(v);
  setColor = v => this.setState({ color: v })
  setBgColor = v => this.setState({ bgColor: v })
  render() {
    return (<div style={{ "padding": "30px" }}>
      <h3 style={{ color: this.state.color }}>子父传参</h3>
      {/* 把方法当属性props传入给子元素Ctrl */}
      <Ctrl setColor={this.setColor}></Ctrl>
      <h3 style={{ backgroundColor: this.state.bgColor }}>颜色控制器</h3>
      <Ctrl setColor={this.setBgColor}></Ctrl>
    </div>);
  }
}
export default App;
// 在子组件单击按钮,执行父组件的setColor方法
function Ctrl(props) {
  // console.log(props);
  return (
    <div>
      <button onClick={() => props.setColor('red')}></button>
      <button onClick={() => props.setColor('green')}>绿</button>
      <button onClick={() => props.setColor('blue')}></button>
      <button onClick={() => props.setColor('yellow')}></button>
    </div>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈小天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值