React传递参数的几种方式

父子组件之间传递参数

父组件往子组件传值,直接用this.props就可以实现

在父组件中,给需要传递数据的子组件添加一个自定义属性,在子组件中通过this.props就可以获取到父组件传递过去的数据

// 父组件
 render() {
        return (
                // 使用自定义属性传递需要传递的方法或者参数
                <ShopUi toson={this.state}></ShopUi>
            )
    } 

//子组件 
//通过this.props.toson就可以获取到父组件传递过来的数据

如果还需要往孙组件传递那么在子组件通过自定义属性继续传递就行了

tograndson={this.props.toson}

孙组件通过this.props.tograndson获取到数据

子组件给父组件传值的话,需要在父组件设置接收函数和state,同时将函数名通过props传递给子组件

也就是给子组件传入父组件的方法,在子组件进行调用

//孙子组件
export default class Grandson extends Component{
    render(){
        return (
            <div style={{border: "1px solid red",margin: "10px"}}>
        {this.props.name}:
                <select onChange={this.props.handleSelect}>
                    <option value="男">男</option>
                    <option value="女">女</option>
                </select>
            </div>
        )
    }
};

//子组件
export default class Child extends Component{
    render(){
        return (
            <div style={{border: "1px solid green",margin: "10px"}}>
                {this.props.name}:<input onChange={this.props.handleVal}/>
                <Grandson name="性别" handleSelect={this.props.handleSelect}/>
            </div>
        )
    }
};

//父组件
export default class Parent extends Component{

    constructor(props){
        super(props)
        this.state={
            username: '',
            sex: ''
        }
    },
    handleVal(event){
        this.setState({username: event.target.value});
    },
    handleSelect(value) {
        this.setState({sex: event.target.value});
    },
    render(){
        return (
            <div style={{border: "1px solid #000",padding: "10px"}}>
                <div>用户姓名:{this.state.username}</div>
                <div>用户性别:{this.state.sex}</div>
                <Child name="姓名" handleVal={this.handleVal} handleSelect={this.handleSelect}/>
            </div>
        )
    }
}

前一段时间有人问过我这样一个问题,constructor里面的super()是干嘛用的?

总结一下:

  如果要在子类的constructor里使用this,必须调用父类constructor,否则就拿不到this

  那么问题就来了,如何调用父类的constructor呢? 通过super()

  如果要在constructor里使用父组件传递过来的参数,必须在调用父组件super时,传递参数给父组件的constructor

  如果不在constructor里面使用this,或者参数,就不需要super ; 因为React以及帮你做了this,props的绑定

路由传参

  安装 npm install react-router-dom --save-dev

  定义路由(一般会放在外面)

 <HashRouter>
    <Switch>
        <Route exact path="/" component={Home}/>
        <Route exact path="/detail" component={Detail}/>
    </Switch>
</HashRouter>

当页面跳转时

<li  onClick={el => this.props.history.push({
   pathname:'/detail',
      state:{id:3}
})}
>
</li>

接收    通过this.props.history.location可以获取到传递过来的数据

路由传参可能会有这个问题,就是只有在路由定义时挂载的组件中才会有props里面的location history match

路由上挂载的那个组件一般都是Container.js,一般我们会往下分出UI.js组件,在这里面进行点击跳转,UI组件props里没有location history match

需要用到高阶组件withRouter

状态提升

  将多个组件需要共享的状态提升到离他们最近的那个公共父组件上,然后父组件通过props分发给子组件

context

  当某个组件在自己的context中保存了某个状态,那个该组件下的所有子孙组件都可以访问到这个状态,不需要中间组件的传递,而这个组件的父组件是没办法访问的

class Index extends Component {
  static childContextTypes = {
    themeColor: PropTypes.string
  }

  constructor () {
    super()
    this.state = { themeColor: 'red' }
  }

  getChildContext () {
    return { themeColor: this.state.themeColor }
  }

  render () {
    return (
      <div>
        <Header />
        <Main />
      </div>
    )
  }
}

通过getChildContext()将属性传递给所有的子孙组件
提供 context 的组件必须提供 childContextTypes 作为 context 的声明和验证。

class Title extends Component {
  static contextTypes = {
    themeColor: PropTypes.string
  }

  render () {
    return (
      <h1 style={{ color: this.context.themeColor }}>标题</h1>
    )
  }
}

子组件要获取 context 里面的内容的话,就必须写 contextTypes 来声明和验证你需要获取的状态的类型,它也是必写的,如果你不写就无法获取 context 里面的状态。
Title 想获取 themeColor,它是一个字符串,我们就在 contextTypes 里面进行声明。

引入redux

  redux为React提供可预测化的状态管理机制

  redux将整个应用状态存储到store,store里保存着一个state状态树

  组件可以派发(dispatch)  行为 (action)  给store , 而不是直接通知其它组件

  其它组件可以通过订阅store中的状态state来刷新自己的视图

到此这篇关于React传递参数的几种方式的文章就介绍到这了,更多相关React传递参数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 基于react组件之间的参数传递(详解)

    1.父组件向子组件传递参数 class Child extends Component { componentDidMount(){ let name = this.props.default; console,log(name); } render(){ const { default} = this.props; return ( <Input /> ) } } import React, { Component } from 'react'; import Child from './C

  • React传递参数的几种方式

    父子组件之间传递参数 父组件往子组件传值,直接用this.props就可以实现 在父组件中,给需要传递数据的子组件添加一个自定义属性,在子组件中通过this.props就可以获取到父组件传递过去的数据 // 父组件 render() { return ( // 使用自定义属性传递需要传递的方法或者参数 <ShopUi toson={this.state}></ShopUi> ) } //子组件 //通过this.props.toson就可以获取到父组件传递过来的数据 如果还需要往孙

  • JSP向后台传递参数的四种方式总结

    Jsp页面传值的方法 一.通过Form表单提交传值 客户端通过Form表单提交到服务器端,服务器端通过 Java代码 request.getParameter(String xx); 来取得参数(xx)为参数名称. 通过get/post方式进行提交 二.通过隐藏域传值 通过在表单中加入一个隐藏域来提交到服务器端,这种方式的好处是可以在客户端加入一些自己想要加入的参数,以便得到相应的值. 客户端代码: Java代码 <input type="hidden" name="i

  • vue-router传递参数的几种方式实例详解

    vue-router传递参数分为两大类 编程式的导航 router.push 声明式的导航 <router-link> 编程式的导航 router.push 编程式导航传递参数有两种类型:字符串.对象. 字符串 字符串的方式是直接将路由地址以字符串的方式来跳转,这种方式很简单但是不能传递参数: this.$router.push("home"); 对象 想要传递参数主要就是以对象的方式来写,分为两种方式:命名路由.查询参数,下面分别说明两种方式的用法和注意事项. 命名路由

  • feign实现传递参数的三种方式小结

    需要注意的一点是,feign好像是无法传递list集合类型的,但是你可以通过传递对象类型,然后在接收方再次将对象装在集合中达到集合传递的效果 传递方式一:传递的都是基本数据类型 restful风格参数,用@PathVariable写着走就行了 传递方式二:传递数组类型的参数 不使用restful风格,直接用@RequestParam声明参数之间的对应关系. 传递方式三:传递带有对象的参数 1.使用restful风格的参数要用@Pathvarible声明参数对应关系,@Pathvariable用于

  • SpringBoot用实体接收Get请求传递过来的多个参数的两种方式

    目录 一.Controller层不带任何注解接收参数 二.Controller层通过@ModelAttribute接收参数 最近项目中Controller层查询接口需要通过实体来接受前端传过来的多个参数(Get请求),这个问题困扰了我很久,之前在第二家公司的时候,就因为我后端是Get请求,并且是通过实体去接收前端参数的,导致我当天上线搞到半夜没搞好,这次又遇到,势必解决它. 一年前,通过查看大量的坑爹文章,发现网上没有一篇有效的,这次通过阿里主管的协助,成功的通过实体接收到了Get请求传递过来的

  • 列举ASP.NET页面之间传递值的几种方式

    1 .列举ASP.NET 页面之间传递值的几种方式. 1).使用QueryString, 如....?id=1; response. Redirect()....  2).使用Session变量  3).使用Server.Transfer 为了在页面之间传递变量内容,ASP.NET给了我们几个选择.一种选择是使用QueryString 属性 一:QueryString. 可以使用查询字符串请求网页.ASP.NET中的QueryString访问此信息.当你加载file.html?x = y时,它解

  • flask后端request获取参数的几种方式整理

    最近用 flask 写后端,将获取访问参数的几种方式总结整理一下,仅供参考 从 postman 上来看,调用后端接口传参的方式有两种,一种是 params,参数是以?a=x&b=y 的形式显示在 url 中访问的.还有一种是 body,参数以请求体的形式访问后端,不会直接显示出来.在用这两种传参方式访问后端,后端接收参数的常见的三种方式分别是 r1 = request.form.get('key')r2 = request.args.get('key')r3 = request.values.g

  • Action获取请求参数的三种方式

    方式一:Action本身作为Model对象,通过属性注入(Setter)方法讲参数数据封装到Action中 具体为:在Action中,提供和参数名相同的几个属性,并为其提供set方法,那么,该参数会被自动封装 到该几个属性中. 方式二:创建独立的Model对象,还是通过属性注入的方法将请求数据封装到Model对象中 具体为:另外创建一个专门的类,并在其中添加几个和请求参数名相同的属性,,此时,在表单中,需要讲参数名, 写成Model的一个具体对象名.参数名的方式,然后在Action中,需要定义一

  • 关于Android Activity之间传递数据的6种方式

    使用Inten的putExtra传递 第一个Activity中 //创建意图对象 Intent intent = new Intent(this,TwoActivity.class); //设置传递键值对 intent.putExtra("data",str); //激活意图 startActivity(intent); 第二个Activity中 // 获取意图对象 Intent intent = getIntent(); //获取传递的值 String str = intent.ge

  • MyBatis Mapper接受参数的四种方式代码解析

    这篇文章主要介绍了MyBatis Mapper接受参数的四种方式代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 对于单个参数而言,可以直接写#{param},这里的占位符名称没有限制,反正就一个参数一个占位符,不需要指定名称 对于多个参数,有常用的四种方式 根据位置排序号 public interface UserDao { public Integer addUser(String username, String password)

随机推荐