最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - ShowHide a component in React using state - Stack Overflow

programmeradmin1浏览0评论

I'm trying to hide / show a ponent while checking a state value :

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
import Button from '@material-ui/core/Button'

class App extends Component {
    constructor(props) {
        super(props);
        this.state = true;
    }

    render() {    
        return (
          <div className="App">
            {this.state && <Button variant="raised" onClick={this.state=false}>Button</Button>}

          </div>
        );
    }
}

export default App;

I don't know where's the bug / wrong code, but the render doesn't seems to refresh.

I'm trying to hide / show a ponent while checking a state value :

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
import Button from '@material-ui/core/Button'

class App extends Component {
    constructor(props) {
        super(props);
        this.state = true;
    }

    render() {    
        return (
          <div className="App">
            {this.state && <Button variant="raised" onClick={this.state=false}>Button</Button>}

          </div>
        );
    }
}

export default App;

I don't know where's the bug / wrong code, but the render doesn't seems to refresh.

Share Improve this question edited Oct 2, 2018 at 9:15 Sulthan 130k23 gold badges220 silver badges274 bronze badges asked Oct 2, 2018 at 9:09 ZenyoZenyo 571 gold badge3 silver badges8 bronze badges 1
  • 1 You need to supply a function to the onClick property. this.state=false is clearly not one. You also need to use setState method rather than setting directly. And if you're there, make your state an object for the better. – gorhawk Commented Oct 2, 2018 at 9:12
Add a ment  | 

3 Answers 3

Reset to default 7

You are using it incorrectly. You have to init the state like this

constructor(props) {
  super(props);
  this.state = {show: true}
}

and render it like this

return (
    <div className="App">
        {this.state.show && <Button variant="raised" onClick={() => this.setState({show:false})}>Button</Button>}

      </div>
);

You can't declare this.state as a variable, that should return an error on pile. As Murat said.

State in react is a JS object and is declared as such:

this.state = { ... }

In order to mutate (change) the state, you can't do it directly in react or else react will not know it has changed. If you were to say declare your state as:

this.state = {show: true}

and then wanted to change the boolean to false, you couldn't do it by simply doing this.state.show = false. React wouldn't know that the change had happened, that is why you need to use a react method called setState(). As Murat said you will change the state by using the following onClick metod: onClick={() => this.setState({show:false})}.

You should check this documentation page about react state for more on it, it is an important part of working with React.JS.

https://reactjs/docs/state-and-lifecycle.html

There's a section on the article titled "Using state correctly" have a look at that. :)

In a a React ponent, this.state is expected to be an object representing the state of your ponent.

1) this.state must be initialized (either in the constructor or in the class body)

example in the constructor:

constructor(props) {
    super(props);
    this.state = {
        showButton: true
    };
}

2) The event handler must be a reference to a method (this.handleButtonClick) of your ponent and this method must be bound to the ponent instance:

constructor(props) {
    super(props);
    this.state = {
        showButton: true
    };
    this.handleButtonClick = this.handleButtonClick.bind(this);
}
handleButtonClick(event) {
    this.setState(() => ({ showButton: false }));
}
render() {

    return (
        <div className="App">
            {this.state.showButton && <Button variant="raised" onClick={this.handleButtonClick}>Button</Button>}

        </div>
    );
}

Note that you musn't set state directly but rather use the setState method, the signature of setState that I used is the updater form, look into react documentation for explaination on this.

发布评论

评论列表(0)

  1. 暂无评论
ok 不同模板 switch ($forum['model']) { /*case '0': include _include(APP_PATH . 'view/htm/read.htm'); break;*/ default: include _include(theme_load('read', $fid)); break; } } break; case '10': // 主题外链 / thread external link http_location(htmlspecialchars_decode(trim($thread['description']))); break; case '11': // 单页 / single page $attachlist = array(); $imagelist = array(); $thread['filelist'] = array(); $threadlist = NULL; $thread['files'] > 0 and list($attachlist, $imagelist, $thread['filelist']) = well_attach_find_by_tid($tid); $data = data_read_cache($tid); empty($data) and message(-1, lang('data_malformation')); $tidlist = $forum['threads'] ? page_find_by_fid($fid, $page, $pagesize) : NULL; if ($tidlist) { $tidarr = arrlist_values($tidlist, 'tid'); $threadlist = well_thread_find($tidarr, $pagesize); // 按之前tidlist排序 $threadlist = array2_sort_key($threadlist, $tidlist, 'tid'); } $allowpost = forum_access_user($fid, $gid, 'allowpost'); $allowupdate = forum_access_mod($fid, $gid, 'allowupdate'); $allowdelete = forum_access_mod($fid, $gid, 'allowdelete'); $access = array('allowpost' => $allowpost, 'allowupdate' => $allowupdate, 'allowdelete' => $allowdelete); $header['title'] = $thread['subject']; $header['mobile_link'] = $thread['url']; $header['keywords'] = $thread['keyword'] ? $thread['keyword'] : $thread['subject']; $header['description'] = $thread['description'] ? $thread['description'] : $thread['brief']; $_SESSION['fid'] = $fid; if ($ajax) { empty($conf['api_on']) and message(0, lang('closed')); $apilist['header'] = $header; $apilist['extra'] = $extra; $apilist['access'] = $access; $apilist['thread'] = well_thread_safe_info($thread); $apilist['thread_data'] = $data; $apilist['forum'] = $forum; $apilist['imagelist'] = $imagelist; $apilist['filelist'] = $thread['filelist']; $apilist['threadlist'] = $threadlist; message(0, $apilist); } else { include _include(theme_load('single_page', $fid)); } break; default: message(-1, lang('data_malformation')); break; } ?>