簡體   English   中英

React JS單向數據流混亂

[英]React JS one way data flow confusion

這是我想用reactJS實現的jquery解決方案

var offCanvass = function() {
        $('body').on('click', '.js-fh5co-nav-toggle', function(event) {

            var $this = $(this);

            $('#fh5co-offcanvass').toggleClass('fh5co-awake');
            $('#fh5co-page, #fh5co-menu').toggleClass('fh5co-sleep');

            if ($('#fh5co-offcanvass').hasClass('fh5co-awake')) {
                $this.addClass('active');
            } else {
                $this.removeClass('active');
            }
            event.preventDefault();

        });
    };

我能做的是:通過使用狀態和類名,我可以更改該組件內事件的特定組件的CSS類。

var classNames = require('classnames');
export default class App extends React.Component {

    render() {
      var navClass = classNames({
        'js-fh5co-nav-toggle': true,
        'fh5co-nav-toggle': true,

      });
        return (
            <div>
                <Offcanvas/>
                <Menu navClass={navClass}/>
                <Page/>
            </div>
        );
    }
}

export default class Menu extends React.Component {
  constructor(){
    super();
    this.state={
      isPressed: false,
    };
  }

  isPressed(){
    if(!this.state.isPressed){
        this.setState({isPressed: true});
    }else{
       this.setState({isPressed: false});
         }
  }

    render() {
        var navClass = classNames(this.props.navClass, {
          active: this.state.isPressed
        });
        return (
            <div id="fh5co-menu" class="navbar">
              <div class="container">
                <div class="row">
                  <div class="col-md-12">
                    <a class={navClass}  data-toggle="collapse" onClick={this.isPressed.bind(this)} data-target="#fh5co-navbar" aria-expanded="false" aria-controls="navbar"><span></span> <i></i></a>
                    <a href="/index" class="navbar-brand"><span>dota groove<a class=""></a></span></a>
                  </div>
                </div>
              </div>
            </div>
        );
    }
}

export default class Canvas extends React.Component {


  render(){
    return(
        <div id="fh5co-offcanvass">
          <ul>
            <li class="active"><a href="" data-nav-section="home">Home</a></li>
            <li><a href="" data-nav-section="login">Register</a></li>
            <li><a href="" data-nav-section="clients">Login</a></li>
          </ul>
        </div>
    );
  }
}

我想要做的事情:使用來自一個組件的事件來觸發不在自上而下層次結構中的另一個組件的類名更改。 這是我的組件結構。

-app
  -canvas ->classname apends here
  -menu ->if click event occurs here
  -page

以下模式適合您嗎?

子組件( menu )通過單擊事件更改其父( app )的狀態。 然后父母通過道具將更新后的狀態發送給另一個孩子( canvas )。

這是一個描述這種模式的簡短代碼運動: https ://www.codecademy.com/en/courses/react-102/lessons/child-updates-sibling/exercises/child-updates-sibling-intro

您的<App/>需要處理該事件。 您可以將回調函數作為支持傳遞給<Menu /> ,點擊此功能在App調用。 現在,應用程序可以對點擊作出反應並將道具傳遞給<Canvas/>

class App extends Component {
  constructor() {
    super();
    this.state = {clicked: false};
  }

  handleClick() {
    this.setState({clicked: !this.state.clicked});
  }

  render() {
    return (
     <div>
       <OffCanvas isClicked={this.state.clicked} />
       <Menu onClick={() => this.handleClick()} />
     </div>
    );
  }
}

這是一個很常見的反應模式。

關於你的jquery例子的旁注:你在那里所做的一切都很容易用“vanilla”JS完成,不需要jquery。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM