简书项目(二,redux的使用)

本文介绍了如何使用Redux管理React应用的状态,包括创建基础功能、简化reducer、action的拆分、引入immutable防止状态改变以及使用redux-immutable处理子组件状态。通过这些步骤,将Header组件转化为无状态组件,提高代码的可维护性和组织性。
摘要由CSDN通过智能技术生成

一.使用redux管理状态的常规案例:

1.创建基础功能

安装redux,react-redux

yarn add redux react-redux

创建仓库store
store
管理员reducer
在这里插入图片描述
组件中引入仓库
在这里插入图片描述

在子组件中进行链接

使用react-redux里的connect方法进行和父组件进行链接.
在这里插入图片描述
connect()方法里接收两个参数:mapStateToProps和mapDispathToProps
在这里插入图片描述
删除Header组件里的state,在reducer管理员手册里写状态
在这里插入图片描述

映射并使用

在这里插入图片描述
在管理手册中改为true,发现样式生效了.

同时,获焦和失焦的事件也不能是state来操作了

我们注释掉这两个方法和constructer
在这里插入图片描述
在this.获焦和失焦方法里也统一改为
在这里插入图片描述
在获焦方法里定义action对象,如:
在这里插入图片描述
回到reducer管理员这里操作改变数据
在这里插入图片描述
发现有效哦,同样方法失去焦点也这样写
在这里插入图片描述
在这里插入图片描述
最终的效果一致.
在这里插入图片描述
通过redux的引用,我们实现了将类里面的state放入到了仓库里进行管理,这样Header组件就变成了一个无状态的组件(无state,只有一个render函数,仓库的引用放在了App.js里),这样我们完全可以把它做成函数的形式(去掉里面的this),效果也是一样的,代码如下:

import React from 'react'
import {
  HeaderWrapper,
  Logo,
  Nav,
  NavItem,
  NavSearch,
  Addition,
  Button,
  SearchWrapper,
 
} from './style'
import { CSSTransition } from 'react-transition-group';
import {connect} from 'react-redux'

function Header(props) {
  return (
    <HeaderWrapper>
    <Logo />
    <Nav>
      <NavItem className="left">首页</NavItem>
      <NavItem className="left">下载App</NavItem>
      <NavItem className="right login">登录</NavItem>
      <NavItem className="right">
        <span className="iconfont iconAa" />
      </NavItem>
      <SearchWrapper>
        <CSSTransition
        timeout={200}
        in={props.focused}
        classNames='slide'
        >
        <NavSearch 
        onFocus={props.handleInputFocus} 
        onBlur={props.handleInputBlur}
        className={
          props.focused?'focused':''
        }/>
        </CSSTransition>
        <span className={props.focused?'focused iconfont iconai219 ':'iconfont iconai219 '} />
      </SearchWrapper>
    </Nav>
    <Addition>
     
        <span className="iconfont iconpan_icon" />
        <Button className="writting">写文章</Button>
       <Button className="reg">注册</Button>
    </Addition>
  </HeaderWrapper>

  )
  
}
const mapStateToProps=(state)=>{
  //state就是仓库里所有的数据
return {
 focused: state.focused
}
}
const mapDispathToProps=(dispatch)=>{
return {
  handleInputFocus(){
    const action ={
      type:'search_focus'
    }
    dispatch(action)
    
  },//记得这里是逗号哦
  handleInputBlur(){
    // console.log(321);//发现有效
    const action={
      type:'search_blur',
      
    }
    dispatch(action)
  }
}
}
// 记住connect方法是下面这样写的
export default connect(mapStateToProps,mapDispathToProps)(Header) 

二.简化reducer(进行分类,分为大小reducer)

reducer就相当于图书管理员的图书手册,如果我们把很多数据都写在reducer是不合理的,现在开始把reducer分为不同的reducer(相当将图书进行分类)
我们在header里创建reducer分类,将本来属于header组件的所有reducer代码剪切过来
在这里插入图片描述
在大的reducer里重新写
在这里插入图片描述
工具:发现focus已经在header组件下面了.
在这里插入图片描述
回到子组件js文件里,因为reducer已经多了一层header,所以对应的state也应该加上一层header.操作如下:
在这里插入图片描述
最终的效果还是一样.
无关紧要的文件名导入太长小技巧:
小reducer
在这里插入图片描述
大reducer
在这里插入图片描述
这样实现的效果也是一样的.

三.action的拆分

采用actionCreators来代替常量创建的方式,里面写代码如下:
在这里插入图片描述
回到header组件里进行引用和使用
在这里插入图片描述

在actionCreators.js文件里的type类型我们继续做优化

先创建一个constants.js(常量),在里面写如下代码
在这里插入图片描述
在actionCreators.js里导入并修改type类型
在这里插入图片描述
在小的reducer里也进行导入并修改type

在这里插入图片描述

继续优化我们的header组件里的store文件夹,使他默认都导入index.js文件而不用导入store文件夹里的很多其他文件呢

在header/store/index.js里
在这里插入图片描述
这样在header/index.js里,可以不用写那么多路径
在这里插入图片描述
这样效果还是不会变的.
总结:我们实现了一个完美的组件分工
在这里插入图片描述

四.安装immutable让子reducer管理员里的state状态不可改变

安装immutable

yarn add immutable

引入并转化成immutable对象
在这里插入图片描述
回到子组件里进行使用
在这里插入图片描述
同时,返回的也要是immutable对象写法
在这里插入图片描述
immutable对象的set方法原理是:结合之前immutable对象的值和设置的值进行比较,最后返回一个全新的对象,老的对象并没有去改.
这样效果还是一致.

五.安装redux-immutable使子组件header里的focused: state.header也变为immutable对象

安装

yarn add redux-immutable

这里的state.header是在父reducer管理员生成的,所以回到大的reducer里,修改如下代码
在这里插入图片描述
回到子管理员reducer里,返回值也写成immutable对象
在这里插入图片描述
在子组件header中修改state即可
在这里插入图片描述
最终的效果还是一样没变.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
scrapy是一个用于网站抓取和数据提取的Python框架,而微博和简书分别是一个社交媒体平台和一个知识分享平台。要使用scrapy爬取微博评论简书,可以按照以下步骤进行: 首先,需要安装好Python和scrapy框架。可以通过安装Python的pip包管理工具,并使用pip安装scrapy。 然后,对于微博,可以通过登录微博开放平台,注册一个开发者账号,并创建一个应用。获取到应用的App Key和Secret Key,以便进行API调用。在scrapy项目的settings.py文件中添加好相应的key。 接下来,使用scrapy创建一个新的项目。可以使用命令行工具执行以下命令:scrapy startproject weibo 在项目的spiders目录下,创建一个新的spider。可以使用命令行工具执行以下命令:scrapy genspider weibo_spider "weibo.com" 编辑新创建的spider,编写爬取微博评论的代码。可以使用weibo API提供的接口进行评论的爬取。 然后,启动爬虫,执行以下命令:scrapy crawl weibo_spider 在简书的情况下,可以使用简书提供的API接口进行评论的抓取。首先,需要注册一个账号,并通过简书的开发者平台获取到相应的API Key。然后,使用获取到的API Key进行API调用。 创建一个新的spider来实现对简书评论的爬取,类似于上述微博的爬虫。 最后,启动爬虫,执行相应的命令来抓取简书评论。 总之,使用scrapy爬取微博评论简书可以通过利用它提供的网页抓取和数据提取功能,结合微博和简书的API进行相应的数据获取。通过上述步骤的操作,可以简单实现这个目标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值