react之传递数据的几种方式props传值、路由传值、状态提升、redux、context

react之传递数据的几种方式

1、父子传值

父传值:<子的标签 value={‘aaa‘} index={‘bbb‘}></子的标签>

子接值:<li key={this.props.index}>{this.props.value}</li>

不止可以传值也可以传递方法:

父:方法={this.方法}

子:{this.props.方法.bind(this)}

传来的参数子组件可以使用,此处用{value,index}等解构赋值省去this.props

此处的子组件利用这个deleteItem方法向父元素传递了index

父传子,子为styled

父:

  <Lun pic={this.state.good ? this.state.good.image : ‘‘}></Lun>

子:

  const Lun = styled.div`

    width:100%;

    height:375px;

    background:url(‘${props => props.pic}‘) center no-repeat;

    background-size: cover;

  `


2、路由传值

import { BrowserRouter } from ‘react-router-dom‘

包在最外层,我放在了我的react项目的index.js里

方法一:/路径/:自己起的要传的值的名字

父组件:import { Route, Switch, Redirect } from ‘react-router-dom‘

class App extends Component {
  render() {
    return (
      <Switch>
        <Redirect exact from="/" to="/car"></Redirect>
        <Route path=‘/home‘ component={Bar}/>
        <Route path="/shopDetail/:shopId/:shopName/:shopNote/:shopPic" component={ShopDetail} />
        <Route path=‘/noteDetail/:noteId‘ component={NodeDe} />
        <Route path=‘/goodDetail/:goodId/:shopId‘ component={GoodDetail} />
        <Route path=‘/car‘ component={Car} />
      </Switch>
    );
  }
}

export default App;
         子组件:          <LogoCon>
            <div>
              <img src=‘https://ci.xiaohongshu.com/98320dbb-536e-451a-a53f-98724b56d380?imageView2/3/w/420/h/600/format/jpg/q/90‘ />
              <div>
                <h2>{this.props.match.params.shopName}</h2>
                <h6></h6>
                <h5>{this.props.match.params.shopNote}篇笔记</h5>
              </div>
              <a href="javascript:void(0)">关注</a>
            </div>
          </LogoCon>

方法二:

var data = {id:0,name:‘lili‘,age:16};

data = JSON.stringify(data);

var path = `/user/${data}`;

<Link to={path}>用户</Link>
var data = this.props.location.query;

var {id,name,age} = data;


3、状态提升:其原理是两个或者多个组件需要共享的数据放在他们公共的祖先身上,通过props实现共享

L:父组件为<A></A>

   子组件为<B></B>

在父组件中调用子组件:

<A>

  <B {...props}></B>

</A>

以此类推。



4、redux

已我自己写的一个小demo为例子:

大概项目大概如第二张图,具体应用体现在goodDetail文件夹内

新建一个store文件夹,做一个数据处理的汇总

store/redecers.js
store/redecers.js

import { combineReducers } from ‘redux‘

import shop from ‘pages/shop/reducer‘
import car from ‘pages/goodDetail/reducer‘

export default combineReducers({
    shop,
    car
})

store/index.js

import { createStore, applyMiddleware } from ‘redux‘

import thunk from ‘redux-thunk‘

import reducers from ‘./reducers‘

const store = createStore(reducers, applyMiddleware(thunk))

export default store

goodDetail/actionType.js

export const GET_CAR_DATA = ‘car/get_car_data‘

goodDetail/actionCreator.js

import { GET_CAR_DATA } from ‘./actionType‘

export const loadCarDataSync = (goods) => {
    //console.log(goods)
    return {
      type: GET_CAR_DATA,
      goods:goods
    }
  }

  export const loadCarDataAsync = (dispatch,obj) => {
    // console.log(1)
    //console.log(obj)
    return () => {
        dispatch(loadCarDataSync(obj))
    }
  }

goodDetail/reducer.js(处理数据)

import {GET_CAR_DATA} from ‘./actionType‘

const defaultState = {
    goods:[{
      shopName: "豌豆公主海外美妆集合店",
      he:[
        { image: "https://img.xiaohongshu.com/items/[email protected]_320w_320h_1e_1c_0i_90Q_1x_2o.jpg",
          introduce: "clé de Peau Beauté肌肤之钥 沁肌紧肤水磨精华液 170ml",
          kuSave: 296161,
          num: 4,
          price: 609
        }
      ]
    }
  ]
}

export default (state=defaultState, action) => {
    if (action.type === GET_CAR_DATA) {
      if(!!state.goods){
        const obj = state.goods.find(v => v.shopName === action.goods.shopName )
        if(!!obj){
          const same = obj.he.find(i => i.introduce === action.goods.he[0].introduce )
          console.log(obj)
          if(!!same){
            same.num++;
          }else{
            obj.he.push(...action.goods.he)
          }
          return {
            goods: [...state.goods]
          }
        }else{
          return {
            goods: [...state.goods,action.goods]
          }
        }
      }
      else{
        return {
          goods: [action.goods]
        }
      }
    }

    return state
}  

整个项目最外面的index.html中引入

import store from ‘./store‘

在goodDetail/goodDetai.js中

import { connect } from ‘react-redux‘

import {
    Link,
    withRouter
} from ‘react-router-dom‘

import { loadCarDataAsync } from ‘./actionCreator‘

const mapState = (state) => {
    //console.log(state)
    return {
      goods: state.car.goods
    }
}

const mapDispatch = (dispatch) => {
    return {
        loadCategories (obj) {
            //console.log(obj)
            dispatch(loadCarDataAsync(dispatch,obj))
        }
    }
}

中间代码省略,在你需要的地方调用
          this.props.loadCategories(
                {
                    shopName:this.state.good.vendor_name,
                    he:[{
                        image:this.state.good.image,
                        introduce:this.state.good.desc,
                        price:this.state.good.discount_price,
                        kuSave:this.state.good.fav_info.fav_count,
                        num:Number(this.refs.goodNum.value)
                    }]
                }
            )    (参数可传可不传,不传的话,其余对应的地方记得修改)

export default withRouter(connect(mapState, mapDispatch)(GoodDetail))


5、context

不合适修改数据

更适合共享数据

getChildContext()

祖先组件:

  1>import PropsTypes from ‘prop-types‘

  2>static childCOntextTypes={

    XX:PropsTypes.string

   }

  3>getChildContext(){

    return {XX:xx}

   }

  4>引入一个子组件

子组件接收:

  this.context.XX

原文地址:https://www.cnblogs.com/yangyangxxb/p/10035834.html

时间: 2024-08-17 18:09:53

react之传递数据的几种方式props传值、路由传值、状态提升、redux、context的相关文章

Android学习笔记(十二)——使用意图传递数据的几种方式

使用意图传递数据的几种方式 点此获取完整代码 我们除了要从活动返回数据,也常常要传递数据给活动.对此我们可以使用Intent对象将这些数据传递给目标活动. 1.创建一个名为PassingData的项目,在activity_main.xml文件中添加一个Button: <Button android:id="@+id/btn_SecondActivity" android:layout_width="fill_parent" android:layout_hei

EF5(7) 后台使用SelectListItem传值给前台显示Select下拉框;mvc后台Action接收浏览器传值的4种方式; 后台Action向前台View视图传递数据的四种方式

一:后台使用SelectListItem 传值给前台显示Select下拉框 我们先来看数据库的订单表,里面有3条订单,他们的用户id对应了 UserInfo用户表的数据,现在我们要做的是添加一个Order控制器,显示订单列表,并且在修改订单的时候,把用户的id 用 select 下拉框显示出来,并且可以提交修改数据   1.1 我们通过比较原始的方法,来把数据 传递到前台后,前台使用  循环来显示 select 并且显示是哪个元素被选中 我们在前台的cshtml中,使用 @model 命令 指定

安卓通过putExtra传递数据的几种方式

通过intent传递数据时,使用以下代码报错: hMap<String, Object> map=(Map<String, Object>) parent.getItemAtPosition(position); intent.putExtra("userInfoMap", map); 但是使用以下的代码是正常的: HashMap<String, Object> map=(HashMap<String, Object>) parent.g

Android 学习之路 1:Activity之间传递数据的四种方式

传递数据 新建 Activity 在项目中右键,选择 New,继续选择中下方的 Activity,最后是 Blank Activity. 此时 Android Studio 会为我们自动添加一个对应的布局文件,为布局文件中的 TextView 添加 ID,以便后续使用. 用Intent 发送数据 在主布局文件中新建一个 Button 控件,并在主类中定义它,然后为它设置 Click 的监听事件. Button button; @Override protected void onCreate(B

ASP.NET MVC2中Controller向View传递数据的三种方式

转自:http://www.cnblogs.com/zhuqil/archive/2010/08/03/Passing-Data-from-Controllers-to-View.html 在Asp.net mvc开发中,Controller需要向View提供Model,然后View将此Model渲染成HTML.这篇文章介绍三种由Controller向View传递数据的方式,实现一个DropDownList的显示. 第一种:ViewData ViewData是一个Dictionary.使用非常简

android中activity之间传递数据的3种方式

在android开发中总是需要不停的传递数据,特别是不同的Activity之间.在这里小编介绍自己所知的3种Activity的跳转方式. 第一种:静态传递数据 直接上部分代码:在第一个Activity中 Intent intent = new Intent(); intent.setClass(MainActivity.this,SecondActivity.class); SecondActivity.usrname = "jack"; SecondActivity.password

在不同Activity传递数据(四种方式)

四种传递方法: 1.通过Intent传递数据: 2.通过静态变量传递数据: 3.通过剪切板传递数据: 4.通过全局对象传递数据: 分类介绍: 1.通过Intent传递数据: 代码如下: 布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_

intent传递数据的二种方式startActivityForResult为什么不行?

============问题描述============ package com.example.intentsenddatademo; import java.util.List; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBar; import android.support.v4.app.Fragment; import android.content.Inten

总结前台传递数据的几种方式:

1.JQuery的ajaxSubmit(obj)方法 ajaxSubmit(obj)方法是jQuery的一个插件jquery.form.js里面的方法,所以使用此方法需要先引入这个插件. 它是如何传递数据的呢?首先我们需要一个form表单: <form id="mainform" name="mainform" action="myaction" method="post"> 标题:<input type=&