Typescript 搭配 react-reudx 数据操作

使用 Typescript 搭配 react-reudx 进行数据操作,基本上按照 react-reudx 的操作进行
App.tsx 文件内容

import * as React from 'react'
import {Provider} from 'react-redux'
import {store} from './store'
import Todo from './Todo'

class App extends React.Component {
    render() {
        return(
            <Provider store={store}>
                <Todo />
            </Provider>
        )
    }
}

export default App 

使用 <Provider> 包裹组件(甚至可以在index.tsx 中直接包裹 App组件)

import React from 'react'
import { connect } from 'react-redux'
import { inputChange, addValueAction } from './store/action'

const stateToProps = (state: any) => {
    return ({
        // inputValue: state.inputValue
        state
    })
}

const dispatchToProps = (dispatch: any) => {
    return ({
        inputChangeValue: (e: any) => {
            // 将 action 分离出去
            const action = inputChange(e.target.value)
            dispatch(action)
        },
        onEnter: (e: any) => {
            // console.log(e.keyCode);
            if (e.keyCode === 13) {
                const action = addValueAction()
                dispatch(action)
            }
        }
    })
}

// Typescript 类型别名——映射类型
type connectProps = ReturnType<typeof stateToProps> & ReturnType<typeof dispatchToProps>

// 将映射类型规则加入组件,才能使用 stateToProps 、dispatchToProps,否则报错
class Todo extends React.Component<connectProps> {
    render() {
        return (
            <div>
                <input 
                type="text" 
                value={this.props.state.inputValue} 
                onChange={this.props.inputChangeValue} 
                onKeyUp={this.props.onEnter} 
                />
                <div>
                    {this.props.state.list ? 
                    this.props.state.list.map((item:any,index:number)=> <div key={index}>{item.things}</div> )
                    : ''}
                </div>
            </div>
        )
    }
}

export default connect(stateToProps, dispatchToProps)(Todo)

在组件中从 'react-redux' 引入 connect ,并将 statedispatch 放入到 props 中

在这里插入图片描述
注意: 这里使用状态组件(即class类组件),需要写一个映射类型,给class类组件,否则报错

在这里插入图片描述
另外,如果组件内部除了 render() 函数,没有其他函数方法,可视为 UI 组件,可以将其用无状态组件替换,并可省略上述的映射

const Todo = (props: any) => {
    return (
        <div>
            <input
                type="text"
                value={props.state.inputValue}
                onChange={props.inputChangeValue}
                onKeyUp={props.onEnter}
            />
            <div>
                {props.state.list ?
                    props.state.list.map((item: any, index: number) => <div key={index}>{item.things}</div>)
                    : ''}
            </div>
        </div>
    )
}

只将 Todo组件 从有状态组件改为无状态组件,其他不变

完整项目链接:https://github.com/Shay-Cormac/react-redux-study

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值