react 父子组件之间的通信和函数调用

绝地灬酷狼 2022-07-15 01:50 283阅读 0赞

#

【react】父组件向子组件传值

父向子是用props,然后再子那边有一个监听函数

  1. componentWillReceiveProps:function(nextProps){
  2. this.setState({
  3. visible:nextProps.visible,
  4. item:nextProps.item,
  5. value:nextProps.value,
  6. version:nextProps.version
  7. });
  8. },

父类调用子类的函数

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <script src="../../dist/react/react.js"></script>
  7. <script src="../../dist/react/JSXTransformer.js"></script>
  8. <script src="../../dist/jquery/jquery.min.js"></script>
  9. <!--如下的这种引用方式是不正确的,必须使用上面的引用方式-->
  10. <!--<script src="../../dist/react/JSXTransformer.js"/>-->
  11. </head>
  12. <body>
  13. <div id="index-0331-0011"></div>
  14. <script type="text/jsx">
  15. var ButtonComment = React.createClass({
  16. getInitialState: function () {
  17. return {count:0};
  18. },
  19. sendSword: function () {
  20. var newCount = this.state.count + 1;
  21. this.setState({count:this.state.count + 1});
  22. this.props.getSwordCount();
  23. },
  24. render: function () {
  25. return (
  26. <button onClick={this.sendSword}>{this.props.buttonName}</button>
  27. );
  28. }
  29. });
  30. var ImDaddyComponent = React.createClass({
  31. getInitialState: function () {
  32. return {sendCount:0};
  33. },
  34. sendSword: function () {
  35. this.refs.getSwordButton.sendSword();
  36. },
  37. getSwordCount: function () {
  38. this.setState({sendCount:this.refs.getSwordButton.state.count + 1});
  39. },
  40. render: function () {
  41. return (
  42. <div>
  43. <ButtonComment ref="getSwordButton" getSwordCount={this.getSwordCount} buttonName="儿子送宝刀"/>
  44. <button onClick={this.sendSword}>通过老爸送宝刀</button>
  45. <p>
  46. 父子俩共送{this.state.sendCount}把宝刀!!!
  47. </p>
  48. </div>
  49. );
  50. }
  51. });
  52. React.render(
  53. <ImDaddyComponent />,
  54. document.getElementById('index-0331-0011')
  55. );
  56. </script>
  57. </body>
  58. </html>

#

【react】子组件向父组件传值

reactjs是一枚新进小鲜肉,跟gulp搭配流行一段时间了。工作或者面试中经常遇到这样的问题,“子组件如何向父组件传值?”。其实很简单,概括起来就是:react中state改变了,组件才会update。父写好state和处理该state的函数,同时将函数名通过props属性值的形式传入子,子调用父的函数,同时引起state变化。子组件要写在父组件之前。具体写法看下面3个例子。

例子1.这里如下图,用户邮箱为父,绿色框为子。 父组件为用户输入的邮箱设好state,即“{email: ‘’}”,同时写好处理state的函数,即“handleEmail”,这两个名称随意起;再将函数以props的形式传到子组件,子组件只需在事件发生时,调用父组件传过来的函数即可。

545055-20160901172841808-1770199726.png

  1. //以下所有例子对应的html
  2. <body>
  3. <div id="test"></div>
  4. </body>

复制代码

  1. //子组件
  2. var Child = React.createClass({
  3. render: function(){
  4. return (
  5. <div>
  6. 请输入邮箱:<input onChange={
  7. this.props.handleEmail}/>
  8. </div>
  9. )
  10. }
  11. });
  12. //父组件,此处通过event.target.value获取子组件的值
  13. var Parent = React.createClass({
  14. getInitialState: function(){
  15. return {
  16. email: ''
  17. }
  18. },
  19. handleEmail: function(event){
  20. this.setState({email: event.target.value});
  21. },
  22. render: function(){
  23. return (
  24. <div>
  25. <div>用户邮箱:{
  26. this.state.email}</div>
  27. <Child name="email" handleEmail={
  28. this.handleEmail}/>
  29. </div>
  30. )
  31. }
  32. });
  33. React.render(
  34. <Parent />,
  35. document.getElementById('test')
  36. );

复制代码

例子2.有时候往往需要对数据做处理,再传给父组件,比如过滤或者自动补全等等,下面的例子对用户输入的邮箱做简单验证,自动过滤非数字、字母和”@.”以外的字符。

545055-20160901184651824-417636944.png

复制代码

  1. //子组件,handleVal函数处理用户输入的字符,再传给父组件的handelEmail函数
  2. var Child = React.createClass({
  3. handleVal: function() {
  4. var val = this.refs.emailDom.value;
  5. val = val.replace(/[^0-9|a-z|\@|\.]/ig,"");
  6. this.props.handleEmail(val);
  7. },
  8. render: function(){
  9. return (
  10. <div>
  11. 请输入邮箱:<input ref="emailDom" onChange={
  12. this.handleVal}/>
  13. </div>
  14. )
  15. }
  16. });
  17. //父组件,通过handleEmail接受到的参数,即子组件的值
  18. var Parent = React.createClass({
  19. getInitialState: function(){
  20. return {
  21. email: ''
  22. }
  23. },
  24. handleEmail: function(val){
  25. this.setState({email: val});
  26. },
  27. render: function(){
  28. return (
  29. <div>
  30. <div>用户邮箱:{
  31. this.state.email}</div>
  32. <Child name="email" handleEmail={
  33. this.handleEmail}/>
  34. </div>
  35. )
  36. }
  37. });
  38. React.render(
  39. <Parent />,
  40. document.getElementById('test')
  41. );

复制代码

例子3.如果还存在孙子组件的情况呢?如下图,黑框为父,绿框为子,红框为孙,要求子孙的数据都传给爷爷。原理一样的,只是父要将爷爷对孙子的处理函数直接传下去。

545055-20160901185242777-119196007.png

复制代码

  1. //孙子,将下拉选项的值传给爷爷
  2. var Grandson = React.createClass({
  3. render: function(){
  4. return (
  5. <div>性别:
  6. <select onChange={
  7. this.props.handleSelect}>
  8. <option value="男">男</option>
  9. <option value="女">女</option>
  10. </select>
  11. </div>
  12. )
  13. }
  14. });
  15. //子,将用户输入的姓名传给爹
  16. //对于孙子的处理函数,父只需用props传下去即可
  17. var Child = React.createClass({
  18. render: function(){
  19. return (
  20. <div>
  21. 姓名:<input onChange={
  22. this.props.handleVal}/>
  23. <Grandson handleSelect={
  24. this.props.handleSelect}/>
  25. </div>
  26. )
  27. }
  28. });
  29. //父组件,准备了两个state,username和sex用来接收子孙传过来的值,对应两个函数handleVal和handleSelect
  30. var Parent = React.createClass({
  31. getInitialState: function(){
  32. return {
  33. username: '',
  34. sex: ''
  35. }
  36. },
  37. handleVal: function(event){
  38. this.setState({username: event.target.value});
  39. },
  40. handleSelect: function(event) {
  41. this.setState({sex: event.target.value});
  42. },
  43. render: function(){
  44. return (
  45. <div>
  46. <div>用户姓名:{
  47. this.state.username}</div>
  48. <div>用户性别:{
  49. this.state.sex}</div>
  50. <Child handleVal={
  51. this.handleVal} handleSelect={
  52. this.handleSelect}/>
  53. </div>
  54. )
  55. }
  56. });
  57. React.render(
  58. <Parent />,
  59. document.getElementById('test')
  60. );

发表评论

表情:
评论列表 (有 0 条评论,283人围观)

还没有评论,来说两句吧...

相关阅读

    相关 vue父子组件之间通信

    在vue组件通信中其中最常见通信方式就是父子组件之中的通性,而父子组件的设定方式在不同情况下又各有不同。最常见的就是父组件为控制组件子组件为视图组件。父组件传递数据给子组件使用