IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> React核心概念(三) -> 正文阅读

[JavaScript知识库]React核心概念(三)

1.表单

受控组件

使 React 的 state 成为“唯一数据源”,渲染表单的 React 组件还控制着用户输入过程中表单发生的操作。被 React 以这种方式控制取值的表单输入元素就叫做“受控组件”

//在提交表单时打印名称的受控组件
import React, { Component } from 'react'

export default class NameForm extends React.Component {

    state = { value: "" };

    handleChange = (event) => {
        this.setState({ value: event.target.value });
    }

    handleSubmit = (event) => {
        alert('提交的名字: ' + this.state.value);
        event.preventDefault();
    }

    render() {
        return (
            <form onSubmit={this.handleSubmit}>
                <label>
                    名字:
                    <input type="text" value={this.state.value} onChange={this.handleChange} />
                </label>
                <input type="submit" value="提交" />
            </form>
        );
    }
}

textarea 标签

而在 React 中, 使用 value 属性代替
和input用法差不多

<textarea value={this.state.value} onChange={this.handleChange} />

select 标签

React 并不会使用 selected 属性,而是在根 select 标签上使用 value 属性
你可以将数组传递到 value 属性中,以支持在 select 标签中选择多个选项:

<select multiple={true} value={['B', 'C']}>

文件 input 标签

因为它的 value 只读,所以它是 React 中的一个非受控组件。将与其他非受控组件在后续文档中一起讨论

<input type="file" />

处理多个输入

当需要处理多个 input 元素时,我们可以给每个元素添加 name 属性,并让处理函数根据 event.target.name 的值选择要执行的操作

import React, { Component } from 'react'

export default class Demo extends React.Component {
    state = {
        isGoing: true,
        numberOfGuests: 2
    }

    handleInputChange = (event) => {
        const target = event.target;
        const value = target.name === 'isGoing' ? target.checked : target.value;
        const name = target.name;
        this.setState({
            [name]: value
        });
    }

    render() {
        return (
            <form>
                <label>
                    参与:
                    <input
                        name="isGoing"
                        type="checkbox"
                        checked={this.state.isGoing}
                        onChange={this.handleInputChange} />
                </label>
                <br />
                <label>
                    来宾人数:
                    <input
                        name="numberOfGuests"
                        type="number"
                        value={this.state.numberOfGuests}
                        onChange={this.handleInputChange} />
                </label>
            </form>
        );
    }
}

受控输入空值

在受控组件上指定 value 的 prop 会阻止用户更改输入。如果你指定了 value,但输入仍可编辑,则可能是你意外地将value 设置为 undefined 或 null。

ReactDOM.render(<input value="hi" />, mountNode);

setTimeout(function() {
  ReactDOM.render(<input value={null} />, mountNode);
}, 1000);

2状态共享

React是单向数据流,父组件向子组件传递消息通过Props传递,

import React, { Component } from 'react'

// 子组件
class Child extends React.Component {
    render() {
        console.log(this.props.value);  // 123
        return (
            <div>
                从父组件接收的value是: {this.props.value}
            </div>
        );
    }
}

// 父组件
export default class Parent extends React.Component {
    render() {
        return (
            <Child value="123" />
        );
    }
}

子组件向父组件传值(回调函数):通过回调进行传递数据

import React, { Component } from 'react'

// 子组件
export default class InputBox extends React.Component {

    handleChange = (e) => {
        this.props.inputChange(e.target.value);
    }

    render() {
        const input = this.props.input;
        return (
            <form>
                <label for="input">input something:</label>
                <input id="input" value={input} onChange={this.handleChange} />
            </form>
        );
    }
}

// 父组件
export default class Control extends React.Component {
    state = {
        input: ''
    }

    handleChange = (input) => {
        this.setState({ input: input });
    }

    render() {
        return (
            <div>
                <InputBox inputChange={this.handleChange} input={this.state.input} />
                <InputBox inputChange={this.handleChange} input={this.state.input} />
            </div>
        )
    }
}

兄弟组件通信:消息订阅与发布
1.安装

yarn add pubsub-js

2.引用

import PubSub from 'pubsub-js'

3.订阅消息
subscribe()回调函数参数:
msg:这是信息的名称,即subscribe()的第一个参数。
data:这是此次订阅到的消息,即南方日报收到了。
返回值:返回该订阅的id,类似于setInterval()返回的id,用于在组件销毁时取消订阅,这就可以优化了性能。

import React, { Component } from 'react'
import Bar from '../Bar/index'
import PubSub from 'pubsub-js'

export default class App extends Component {

    state = {
        msg: ""
    }

    componentWillMount() {
        // 订阅消息
        PubSub.subscribe(
            // 参数一:信息名称
            'subscribeName',
            (msg, data) => {
                // 第一个参数msg:为信息名称,第二个参数data:为信息内容
                console.log(msg, data);
                this.setState({
                    msg: data
                })
            })
    }

    render() {
        let { msg } = this.state
        return (
            <div>
                <Bar />
                <p style={{ color: 'red' }}>我是订阅的结果:{msg}</p>
            </div>
        )
    }
}

4.发布消息

PubSub.publish("对应于订阅的名称","要发布的内容");
import React, { Component } from 'react'
import PubSub from 'pubsub-js'

export default class Bar extends Component {

    sendMsg = () => {
        // 发布消息
        PubSub.publish(
            // 参数一:信息名称
            'subscribeName',
            // 参数二:要发布的内容
            `我是发布的随机数:${parseInt(Math.random() * 1000)}`)
    }

    render() {
        return (
            <div>
                <button onClick={this.sendMsg}>发布消息</button>
            </div>
        )
    }
}
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-22 22:57:51  更:2021-07-22 22:58:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/6 13:13:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码