React开发实践(2)react起步

简介: React开发实践(2)react起步

1、经典案例之 todoList

  • 写一个最简单的内容
class TodoList extends Component {
  render() {
    return (
      <>
        <div>
          <input />
          <button>submit</button>
        </div>
        <ul>
          <li>打游戏</li>
          <li>学习</li>
        </ul>
      </>
    );
  }
}
export default TodoList;
复制代码
  • 效果是这样的

网络异常,图片无法展示
|

  • 接下来 我想 输入内容 然后 submit 之后 放在下面,怎么办 ?

2、React 响应式思想及事件绑定

  • 首先 React 不直接操作 DOM, 有个经典的公式  UX = F(data),视图来自于数据变化
  • 所以 当前页面需要两部分数据,则需要定义两个数据
  • 数据在哪里定义 ?
class TodoList extends Component {
  constructor(props) {
    super(props);
    this.state = {
      inputValue: "",
      toDoList: [],
    };
  }
  handleInputChange = (e) => {
    this.setState({
      inputValue: e.target.value,
    });
  };
  render() {
    return (
      <>
        <div>
          <input
            value={this.state.inputValue}
            onChange={this.handleInputChange}
          />
          <button>submit</button>
        </div>
        <ul>
          <li>打游戏</li>
          <li>学习</li>
        </ul>
      </>
    );
  }
}
export default TodoList;
复制代码
  • 需要注意几个地方
1、value 数据取决于 state里的 inputValue
  2、不能使用 this.state.inputValue = xxx 这种形式改变 state
  3、需要注意 绑定事件 this 指向问题,通常使用 bind / 箭头函数 () => {xx}
复制代码

3、新增和删除列表项

  • 一个重要的内容 这部分不能固定,我们需要map 遍历数据展示内容

网络异常,图片无法展示
|

  • 我们 还需要 点击 submit 之后 将内容 提交到下方
import React, { Component } from "react";
class TodoList extends Component {
  constructor(props) {
    super(props);
    this.state = {
      inputValue: "",
      toDoList: [],
    };
  }
  handleInputChange = (e) => {
    this.setState({
      inputValue: e.target.value,
    });
  };
  handleButtonClick = () => {
    this.setState({
      toDoList: [...this.state.toDoList, this.state.inputValue],
      inputValue: "",
    });
  };
  render() {
    return (
      <>
        <div>
          <input
            value={this.state.inputValue}
            onChange={this.handleInputChange}
          />
          <button onClick={this.handleButtonClick}>submit</button>
        </div>
        <ul>
          {this.state.toDoList.map((item, index) => (
            <li key={index}>{item}</li>
          ))}
        </ul>
      </>
    );
  }
}
export default TodoList;
复制代码
  • 实现效果

网络异常,图片无法展示
|

  • 非常 nice !
  • 删除功能 怎么实现 ?
  • 拿到每一项 下标

网络异常,图片无法展示
|

网络异常,图片无法展示
|

4、组件的拆分和组件间传值

  • 思路
1、先拆分成小项
  2、父组件 通过属性给子组件传递内容,子组件通过 this.props.xxx 进行接收
  3、并且 子组件 可以调用 父组件的方法(但需要注意 父组件传递方法时 需要进行 this 绑定操作,否则 会出错,将this 绑定自身 )
复制代码
  • 代码时刻
  • ToDoItem.js
import React, { Component } from "react";
class ToDoItem extends Component {
  handleItem = () => {
    const { index, handleContentClick } = this.props;
    handleContentClick(index);
  };
  render() {
    const { item } = this.props;
    return <div onClick={this.handleItem}>{item}</div>;
  }
}
export default ToDoItem;
复制代码
  • 父组件引入使用

网络异常,图片无法展示
|

  • 非常nice !

5、代码优化一下

0、return 里面的东西简化,将逻辑放到一个函数中 
    1、将bind 绑定 放到 constructor 中(就不移动了)
    2、this.setState 更改为 函数写法 (有些作用)
    3、map 便利 加 key (加了)
复制代码

网络异常,图片无法展示
|

网络异常,图片无法展示
|

  • 注意 还有 prevState

网络异常,图片无法展示
|

网络异常,图片无法展示
|

6、关于 React 更多思考

1、声明式的开发方式

  • 与之对应的是 命令式 编程方式 , 比如 jQ, 80% 的时间我们在操作dom 做具体的事情
  • 声明式 编程,数据 驱动视图的变化, 要做的是对 数据的管理部分,组件自身的 状态 使用 state 管理,或者使用 redux 进行 联合式 管理方式

2、可以和其他框架一起使用

  • 听起来挺神奇的事情, 最常规思想,怎么做到这一点呢 ?

网络异常,图片无法展示
|

3、组件化 思想

  • 需要注意两件事情
1、组件都是 大写开头的,h5 标签小写字母开头
  2、父子组件 通信方式
      1、父 ---> 子    直接 props 传值
      2、子 ---> 父  子组件想改变父组件方法怎么处理 ? 调用父组件传递来的方法,间接改变父组件的状态 
复制代码

4、单向数据流 思想

  • 为啥需要单向数据流 ? 而且子组件绝对不能更改父组件传递来的数据
  • 为了 使得数据管理正常,不会出现很多的 bug,比如当前有一个父组件给多个子组件传递了同一个数据,一个子组件更改了 传递的数据,则其他组件的数据也会更改,造成问题

网络异常,图片无法展示
|

网络异常,图片无法展示
|

5、视图层 框架

网络异常,图片无法展示
|

  • 复杂的组件间的信息传递 交给 redux 这种 状态管理来实现

6、函数式编程

  • 类似 constructor  生命 周期 和 其他的 handleXxxx 函数, renderXxxx 函数,都分成 不同的函数部分,不同的函数模块,利于 更改维护和自动化测试
  • 比较重要的思想,可以将函数功能分开, 一个函数做一件事情,并且可将复杂的函数进行拆分

撒花 🎉🎉🎉

更多项目请访问 github  github.com/huanhunmao

gitee 项目地址 gitee.com/huanhunmao/…



相关文章
|
2月前
|
前端开发 JavaScript
深入理解并实践React Hooks —— useEffect与useState
深入理解并实践React Hooks —— useEffect与useState
141 1
|
1月前
|
前端开发 JavaScript API
React开发需要了解的10个库
本文首发于微信公众号“前端徐徐”,介绍了React及其常用库。React是由Meta开发的JavaScript库,用于构建动态用户界面,广泛应用于Facebook、Instagram等知名网站。文章详细讲解了Axios、Formik、React Helmet、React-Redux、React Router DOM、Dotenv、ESLint、Storybook、Framer Motion和React Bootstrap等库的使用方法和应用场景,帮助开发者提升开发效率和代码质量。
107 4
React开发需要了解的10个库
|
1月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
161 2
|
19天前
|
前端开发 JavaScript
手敲Webpack 5:React + TypeScript项目脚手架搭建实践
手敲Webpack 5:React + TypeScript项目脚手架搭建实践
|
1月前
|
前端开发 JavaScript 开发者
React 组件化开发最佳实践
【10月更文挑战第4天】React 组件化开发最佳实践
48 4
|
2月前
|
XML 移动开发 前端开发
使用duxapp开发 React Native App 事半功倍
对于Taro的壳子,或者原生React Native,都会存在 `android` `ios`这两个文件夹,而在duxapp中,这些文件夹的内容是自动生成的,那么对于需要在这些文件夹中修改的配置内容,例如包名、版本号、新架构开关等,都通过配置文件的方式配置了,而不需要需修改具体的文件
|
2月前
|
资源调度 JavaScript 前端开发
使用vite+react+ts+Ant Design开发后台管理项目(二)
使用vite+react+ts+Ant Design开发后台管理项目(二)
|
2月前
|
前端开发 JavaScript UED
深入React Hooks与性能优化实践
深入React Hooks与性能优化实践
44 0
|
3月前
|
开发者 安全 UED
JSF事件监听器:解锁动态界面的秘密武器,你真的知道如何驾驭它吗?
【8月更文挑战第31天】在构建动态用户界面时,事件监听器是实现组件间通信和响应用户操作的关键机制。JavaServer Faces (JSF) 提供了完整的事件模型,通过自定义事件监听器扩展组件行为。本文详细介绍如何在 JSF 应用中创建和使用事件监听器,提升应用的交互性和响应能力。
35 0
|
3月前
|
开发者 自然语言处理 存储
语言不再是壁垒:掌握 JSF 国际化技巧,轻松构建多语言支持的 Web 应用
【8月更文挑战第31天】JavaServer Faces (JSF) 框架提供了强大的国际化 (I18N) 和本地化 (L10N) 支持,使开发者能轻松添加多语言功能。本文通过具体案例展示如何在 JSF 应用中实现多语言支持,包括创建项目、配置语言资源文件 (`messages_xx.properties`)、设置 `web.xml`、编写 Managed Bean (`LanguageBean`) 处理语言选择,以及使用 Facelets 页面 (`index.xhtml`) 显示多语言消息。通过这些步骤,你将学会如何配置 JSF 环境、编写语言资源文件,并实现动态语言切换。
40 0