【问题标题】:react createElement and invariant errors反应 createElement 和不变的错误
【发布时间】:2018-12-22 18:34:06
【问题描述】:

我尝试调整这个tabs 来做出反应。 这个想法是为使用 handleclick 函数单击的键添加活动类

class Tabs extends React.Component {
  constructor(props) {
    super(props);
    this.state = { selected: 0 };
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick(key, event) {
    event.preventDefault();
    this.setState({
      selected: key
    });
  }
  render() {
    var activeClass = this.state.selected === this.props.key ? "active" : "";
    return (
      <React.Fragment>
        <div class="tab">
          <button
            key="1"
            className={"tablinks" + activeClass}
            onClick={this.handleClick}
          >
            London
          </button>
          <button
            key="2"
            className={"tablinks" + activeClass}
            onClick={this.handleClick}
          >
            Paris
          </button>
          <button
            key="3"
            className={"tablinks" + activeClass}
            onClick={this.handleClick}
          >
            Tokyo
          </button>
        </div>
        <div key="1" className={"tabcontent" + activeClass}>
          <h3>London</h3>
          <p>London is the capital city of England.</p>
        </div>

        <div key="2" className={"tabcontent" + activeClass}>
          <h3>Paris</h3>
          <p>Paris is the capital of France.</p>
        </div>

        <div key="3" className={"tabcontent" + activeClass}>
          <h3>Tokyo</h3>
          <p>Tokyo is the capital of Japan.</p>
        </div>
      </React.Fragment>
    );
  }
}

ReactDOM.render(<Tabs />, document.querySelector(".container"));

但我得到两个错误:

警告:React.createElement:类型不应为 null、未定义、布尔值或数字。它应该是一个字符串(对于 DOM 元素)或一个 ReactClass(对于复合组件)。检查Tabs的渲染方法。

未捕获的错误:不变违规:元素类型无效:需要字符串(对于内置组件)或类/函数(对于复合组件),但得到:未定义。检查Tabs的渲染方法。

这里是jsfiddle link

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    在您的 Fiddle 中它无法正常工作,因为使用了 React.Fragment。

    无论如何,即使使用以前的更正它也不起作用,因为 this.props.key 没有引用好变量。

    试试这个

    class Tabs extends React.Component {
        constructor(props) {
        super(props);
        this.state = { selected: '1' };
        this.handleClick = this.handleClick.bind(this);
        }
    
         handleClick (key) {
            this.setState({
                selected: key
            });
        }
    
        isActive (key) {
            return this.state.selected === key ? 'active' : ''
        }
    
        render() {
        var activeClass = (this.state.selected === this.props.key ? 'active' : '');
          return (
      <div>
       <div class="tab"> 
        <button className={'tablinks'+ activeClass} onClick={()=>this.handleClick("1")}>London</button>
          <button  className={'tablinks'+ activeClass} onClick={()=>this.handleClick("2")}>Paris</button>
          <button  className={'tablinks'+ activeClass} onClick={()=>this.handleClick("3")}>Tokyo</button>
        </div>
       <div key='1' className={'tabcontent'+ this.isActive('1')}>
        <h3>London</h3>
        <p>London is the capital city of England.</p>
      </div>
    
      <div key='2' className={'tabcontent'+ this.isActive('2')}>
        <h3>Paris</h3>
        <p>Paris is the capital of France.</p> 
      </div>
    
      <div key='3' className={'tabcontent'+ this.isActive('3')}>
        <h3>Tokyo</h3>
        <p>Tokyo is the capital of Japan.</p>
      </div>
      </div>
      );
        }
      }
      ReactDOM.render(<Tabs />, document.querySelector('.container'));
    

    【讨论】:

      【解决方案2】:

      onClick 处理程序 handleClick 将作为第一个参数而不是键传递事件。如果您想将密钥发送给函数,您可以创建一个内联函数调用 handleClick 并使用您想要的参数。

      您还在小提琴中使用了旧版本的 React,它没有在 React 16 中引入的 React.Fragment,并且您最上面的 div 元素上的 class 属性应该是 className

      示例

      class Tabs extends React.Component {
        state = { selected: 0 };
      
        handleClick = key => {
          this.setState({
            selected: key
          });
        };
      
        render() {
          var activeClass = this.state.selected === this.props.key ? " active" : "";
          return (
            <React.Fragment>
              <div className="tab">
                <button
                  key="1"
                  className={"tablinks" + activeClass}
                  onClick={() => this.handleClick(1)}
                >
                  London
                </button>
                <button
                  key="2"
                  className={"tablinks" + activeClass}
                  onClick={() => this.handleClick(2)}
                >
                  Paris
                </button>
                <button
                  key="3"
                  className={"tablinks" + activeClass}
                  onClick={() => this.handleClick(3)}
                >
                  Tokyo
                </button>
              </div>
              <div className={"tabcontent" + activeClass}>
                <h3>London</h3>
                <p>London is the capital city of England.</p>
              </div>
      
              <div className={"tabcontent" + activeClass}>
                <h3>Paris</h3>
                <p>Paris is the capital of France.</p>
              </div>
      
              <div className={"tabcontent" + activeClass}>
                <h3>Tokyo</h3>
                <p>Tokyo is the capital of Japan.</p>
              </div>
            </React.Fragment>
          );
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-22
        • 2017-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-30
        • 2018-12-19
        相关资源
        最近更新 更多