代码之家  ›  专栏  ›  技术社区  ›  DaFunkyAlex

react.js:从另一个组件调用函数

  •  0
  • DaFunkyAlex  · 技术社区  · 6 年前

    我来自Vue.js,所以我还是有点困惑。

    我有一个消息组件,它显示闪存消息:

    import React, {Component} from "react";
    
    export default class Message extends Component {
    
        constructor(props) {
            super(props);
            this.state = {messages: []};
        }
    
        setMessage(type, body) {
            this.setState({messages: this.state.messages.concat({type: type, body: body})})
            setTimeout(() => {
                this.removeMessage()
            }, 10000);
        }
    
        removeMessage() {
            let messages = this.state.messages;
            messages.shift();
            this.setState({messages: messages});
        }
    
        render() {
            return (
                <div className="uk-messages">
                    {
                        this.state.messages.map((message, index) => {
                            if (message.type === 'error') {
                                message.type = 'danger';
                            }
    
                            return (
                                <div className={'uk-alert-' + message.type} data-uk-alert key={index}>
                                    <p>{message.body}</p>
                                </div>
                            )
                        })
                    }
                </div>
            )    
        }    
    }
    

    我在索引组件中使用此组件:

    import React, {Component} from 'react'
    import ReactDOM from 'react-dom'
    import {BrowserRouter as Router, Link, Route, Redirect} from 'react-router-dom'
    import Auth from './helpers/auth'
    import Message from './helpers/message'
    
    class Index extends Component {
        constructor(props) {
            super(props);
            this.state = {
                authState: Auth.state,
            };
            Auth.initialize();    
        }
    
        render() {
            return (    
                <Router>
                    <div className="uk-flex uk-flex-column">
                        <nav className="uk-navbar-container" data-uk-navbar>
                            <div className="uk-navbar-left">
                                <a className="uk-navbar-item uk-logo" href="#"><img src={'images/logo.png'}/></a>
    
                                <ul className="uk-navbar-nav">
                                    <li><Link to="/">Home</Link></li>
                                </ul>
                            </div>
                            <div className="uk-navbar-right">
                                <ul className="uk-navbar-nav">
                                    <li>
                                        <a href="#" className="uk-open" aria-expanded="true">
                                            <span data-uk-icon="icon: user" />
                                        </a>
    
                                    </li>
    
                                </ul>
                            </div>
                        </nav>
                        <div className="uk-flex-grow-1">
                            <Route path="/" component={Welcome} />
                        </div>
                        <footer>
                            &copy; 2018 stackoverflow.com
                        </footer>
                        <Message />
                    </div>    
                </Router>
            );
        }
    
    }
    
    if (document.getElementById('root')) {
        ReactDOM.render(<Index/>, document.getElementById('root'));
    }
    

    好的,所以索引组件是我开始使用的组件。我导入并呈现消息组件。那就行了。在chrome react控制台中,我选择了message标签,可以添加一些带有

    $R.setmessage(“成功”,“问候我的老朋友!”)

    出现信息。那么现在,如何在索引组件中使用setmessage方法呢?在Vue.js中,它非常简单(使用$parent或$children)…

    3 回复  |  直到 6 年前
        1
  •  3
  •   Tom Fenech    6 年前

    refs

    Message

    messages Index <Message messages={this.state.messages} />

    <Index>

    addMessage <Message>

    const Message = ({ messages, addMessage }) => (
      <div>
        {messages.map(({ text, id }) => <div key={id}>{text}</div>)}
        <button onClick={addMessage}>add</button>
      </div>
    );
    
    class Index extends React.Component {
      constructor(props) {
        super(props);
        this.addMessage = this.addMessage.bind(this);
      }
    
      state = {
        messages: [],
        id: 0
      };
      
      addMessage() {
        this.setState({ 
          messages: [...this.state.messages, { text: "new message", id: this.state.id }],
          id: this.state.id + 1
        });
      }
      
      render() {
        return <Message messages={this.state.messages} addMessage={this.addMessage} />
      }
    }
    
    ReactDOM.render(<Index/>, document.getElementById("root"));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
    <div id="root"></div>
        2
  •  1
  •   Murat Karagöz    6 年前

    refs

    <Message refs={(ref) => this.messageElement = ref }/>
    

    this.messageElement.setMessage();
    
        3
  •  1
  •   Manoz    6 年前

     <Message ref={(c) => this.messageComponent = c} />
    

    Message

     constructor(props) {
            super(props);
            this.state = {messages: []};
            this.setMessage = this.setMessage.bind(this);
        }
    

    Index

      this.messageComponent.setMessage('type','body');
    

    here