React学习第八天——React基础(插槽、redux、React—redux)

React基础

1.插槽

渲染组件的时候,将想要显示的数据相当于“插入”到组件中,在其中可以将数据全部都插入组件中,也可以按需插入

class ParentDom extends React.Component {
  constructor(props) {
    super(props)
    console.log(props)
  }
  render() {
    return (
      <div>
        <h2>组件插槽</h2>
        // 这里循环的是RootDom中的元素 
        {this.props.children}
        //这里设置了一个ChildCom组件,里面有三条数据,稍后在组件中通过条件判断进行按需渲染
        <ChildCom>
          <h2 data-position="header">头部</h2>
          <h2 data-position="main">内容</h2>
          <h2 data-position="footer">尾部</h2>
        </ChildCom>
      </div>
    )
  }
}

class ChildCom extends React.Component {
  render() {
  //设置三个对应的内容属性
    let headerCom, mainCom, footerCom
    //这里循环数据,并且判断每一项内容是否等于刚才上面设置的data-position属性,如果等于,就把内容赋予给他
    this.props.children.forEach((item, index) => {
      if (item.props['data-position'] === 'header') {
        headerCom = item
      } else if (item.props['data-position'] === 'main') {
        mainCom = item
      } else {
        footerCom = item
      }
    })
    return (
      <div>
        <div className="header">{headerCom}</div>
        <div className="main">{mainCom}</div>
        <div className="footer">{footerCom}</div>
      </div>
    )
  }
}
//这里用于将数据插入ParentDom组件中
class RootDom extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      arr: [1, 2, 3],
    }
  }
  render() {
    return (
      <div>
        <ParentDom>
          <h2 data-name="a" data-index={this.state.arr[0]}>
            子组件1
          </h2>
          <h2 data-name="b" data-index={this.state.arr[1]}>
            子组件2
          </h2>
          <h2 data-name="c" data-index={this.state.arr[2]}>
            子组件3
          </h2>
        </ParentDom>
      </div>
    )
  }
}

function App() {
  return (
    <div>
      <RootDom></RootDom>
    </div>
  )
}

2.Redux

redux只是一种状态管理的方案,一般用于中大型项目的时候再去使用

Store:数据仓库,用于保存数据的地方

State:对象,数据仓库里所有的数据都放在一个state中

Action:动作,触发数据改变的方法

Dispatch:将动作触发成方法

Reducer:函数,通过获取动作,改变数据,生成一个新的state,从而改变界面

//首先先导入
import  { createStore } from 'redux'
//这里设置的是获取动作,并执行动作相关的方法去改变数据,更新state

const reducer = (state = { num: 0 }, action) => {
  switch (action.type) {
    case 'add':
      state.num++
      break
    case 'decrement':
      state.num--
      break
    default:
      break
  }
  return { ...state }
}
//把数据仓库creat出来

const store = createStore(reducer)

//接下来写了两个函数,一个增加,一个减少
function add() {
  store.dispatch({ type: 'add' })
  console.log(store.getState())
}
function decrement() {
  store.dispatch({ type: 'decrement' })
  console.log(store.getState())
}

class TestRedux extends React.Component {
  render() {
    //在这里获取仓库中的State值
    let state = store.getState()
    return (
      <div>
        <h2>当前数值为:{state.num}</h2>
        <button onClick={add}>+1s</button>
        <button onClick={decrement}>-1s</button>
      </div>
    )
  }
}

function App() {
  return (
    <div>
      <TestRedux></TestRedux>
    </div>
  )
}

3.React-redux

Provider:自动将store里的state和组件进行关联

mapStateToProps:用于将store的state映射到props

mapDispatchToProps:将store中的dispatch映射到props中,实现方法的共享

Connect:将组件和数据(方法)进行连接

//同样的导入需要的库
import { createStore } from 'redux'
import { connect, Provider } from 'react-redux'

class TestReactRedux extends React.Component {
  render() {
    //通过store的state传给props,直接通过props获取state数据
    
    const value = this.props.value
    
    //将修改数据的事件或者方法传入props,等同于vuex的mapMutation mapState
    
    const onAdd = this.props.onAdd
    
    return (
      <div>
        <h2>这回是:{value}</h2>
        <button onClick={onAdd}>+1s</button>
      </div>
    )
  }
}
//这里设置一个值,用于后续判断这是执行添加的操作
const addAction = {
  type: 'add',
}
const reducer = (state = { num: 0 }, action) => {
  switch (action.type) {
    case 'add':
      state.num++
      break
    default:
      break
  }
  return { ...state }
}
//同样需要创建一个仓库
const store = createStore(reducer)

//将state映射到props
function mapStateToProps(state) {
  return {
    value: state.num,
  }
}

//将修改state数据的方法映射到props
function mapDispatchToProps(dispatch) {
  return {
    onAdd: () => {
      dispatch(addAction)
    },
  }
}

//将两个方法,数据仓库的state和修改state的方法映射到组件上形成新的组件
const AppTest = connect(mapStateToProps, mapDispatchToProps)(TestReactRedux)

ReactDOM.render(
  <Provider store={store}>
    <AppTest></AppTest>
  </Provider>,
  document.querySelector('#root')
)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值