反应不渲染类

Posted

技术标签:

【中文标题】反应不渲染类【英文标题】:React not render class 【发布时间】:2018-12-20 15:30:26 【问题描述】:

我使用客户端路由(HashRouter、Link)。在 App 组件中,我有 3 个组件 - Home、Page1、Page2。我想从服务器获取数据并在 Page1 上动态显示这些数据。但是当我转到此页面时,我有错误:

当我不将 Page1 配置为类并将其配置为 const(就像在 app.jsx Home 组件中一样)时,一切正常,但是当我尝试将它配置为类时,我得到了我描述的这个错误下面。

这是我的代码:

app.jsx

import React from 'react'
import 
  HashRouter as Router,
  Route,
  Link
 from 'react-router-dom'
import  
  Container, 
  Row, 
  Col 
 from 'react-grid-system';
import Page1 from "./page1.jsx";

const Home = () => (
  <div class="container-fixed">
    <div class="row">
      <div class="col-l-4">
        <h2 class="underline">Home</h2>
      </div>
    </div>
  </div>
)

const Subpage = ( match ) => (
  <div>
    <h3>match.params.topicId</h3>
  </div>
)

const Page2 = ( match ) => (
  <div class="container-fixed">
    <div class="row">
      <div class="col-l-4">
        <h2 class="underline">Subpages</h2>
        <ul class="content-list">
          <li class="content-list-item">
            <Link to=`$match.url/subpage1`>
              subpage1
            </Link>
          </li>
          <li class="content-list-item">
            <Link to=`$match.url/subpage2`>
            subpage2
            </Link>
          </li>
          <li class="content-list-item">
            <Link to=`$match.url/subpage3`>
            subpage3
            </Link>
          </li>
        </ul>

        <Route path=`$match.path/:topicId` component=Subpage/>
        <Route exact path=match.path render=() => (
          <h3>Please select a subpage.</h3>
        )/>
      </div>
    </div>
  </div>
)

const App = () => (
      <Router>
        <Container>
          <Row>
            <Col md=2>
              <h2 class="underline">Menu</h2>
              <ul class="content-list">
                <li class="content-list-item">
                  <Link to="/">Home</Link>
                </li>
                <li class="content-list-item">
                  <Link to="/page1">Page1</Link>
                </li>
                <li class="content-list-item">
                  <Link to="/page2">Page2</Link>
                </li>
              </ul>
            </Col>
            <Col>
              <Route exact path="/" component=Home/>
              <Route path="/page1" component=Page1/>
              <Route path="/page2" component=Page2/>
            </Col>
          </Row>
        </Container>
      </Router>  
)

export default App

page1.jsx

import React, Component from 'react';
const Row_ = function(props)
    const id, content = props;
    return (
      <div>
        id: id
        content: content
      </div>
    );
  

  class Page1 extends React.Component 
    constructor(props)
      super(props);
      this.state = 
        datas: [
          id: 14, content: "test",
          id: 25, content: "test2",
          id: 75, content: "test3",
        ]
      ;
    

    handleClick() 
      let fetchedData = gerData();
      this.addDataTohtml(fetchedData.id, fetchedData.content);
    

    getData() 
      fetch('/testdata', 
        method: 'GET',
        headers: 
          'Accept': 'application/json',
          'Content-Type': 'application/json',
        
      )
      .then(results => 
        return results.json();
      )
    

    addDataToHTML(id, content)    
      const datas = [...this.state.datas, 
                    value: id, checked: content
                   ];
      this.setState(
          datas,
      );
    

    render()
      <div class="container-fixed">
        <div class="row">
          <div class="col-l-4">
            <h2 class="underline">Page11</h2>
            this.state.datas.map((row, idx) => 
            return(
                <Row_ 
                    id=row.id
                    content=row.content
                    /> 
                )
            )
            
            <button onClick=this.handleClick>
            Get data
            </button>
          </div>
        </div>
      </div>
    
  

  export default Page1

index.jsx

import React, Component from 'react';
import ReactDOM from 'react-dom';

import App from "./app.jsx";
import "../t_styles/css/components.min.css";
import "../t_styles/js/components.min.js";
import $ from "jquery";

ReactDOM.render((
  <App></App>
), document.getElementById('index'))

【问题讨论】:

一个缩小的 React 错误并没有说太多,遗憾的是。您可以在不缩小代码的情况下再试一次,而是在问题中发布该错误吗?你什么时候收到这个错误? @Tholle 如何关闭最小化 JS 代码? @SeBr 使用 className 而不是 class。 @javed thnx,我修复了它,但另一个错误:link @SeBr 在组件返回方法中添加返回语句。检查我给的帖子。 【参考方案1】:

虽然我看不到实际的错误,但我的猜测是您的处理程序未绑定到class 实例,因此您无法通过this 访问它。

所以要么将它们绑定到class(这通常在constructor 内完成):

this.handleClick = this.handleClick.bind(this);
this.getData= this.getData.bind(this);
this.addDataToHTML= this.addDataToHTML.bind(this);

或者使用将在词法上下文中使用this 的箭头函数语法:

handleClick = () => 
  let fetchedData = gerData();
  this.addDataToHTML(fetchedData.id, fetchedData.content);

【讨论】:

我尝试这样做,但第一种方法不能解决问题,第二种方法有错误 - handleClick = () =&gt; 的语法错误第一个 = 是意外令牌 第二种方法需要一个 babel 插件"plugin-transform-class-properties" 但如果第一种方法不能解决问题,那么无论如何它都不是问题。尽管没有我发布的修复程序,我看不到您的代码正常工作的方法。 我删除了所有方法(handleClick、getData、addDataToHTML),到目前为止错误挂起。也许是路线或类的构造函数的问题?因为如果我将 Page1 配置为 const 一切正常【参考方案2】:
1. use className instead of class.
2. add return statement in your render method of Page1 component

    render()
      return (<div className="container-fixed">
        <div className="row">
          <div className="col-l-4">
            <h2 className="underline">Page11</h2>
            this.state.datas.map((row, idx) => 
            return(
                <Row_ 
                    id=row.id
                    content=row.content
                    /> 
                )
            )
            
            <button onClick=this.handleClick>
            Get data
            </button>
          </div>
        </div>
      </div>)
    

【讨论】:

以上是关于反应不渲染类的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 React HashRouter 和 Apollo 客户端渲染反应类组件?

反应渲染数组

误解反应。 FC与类组件交互

Twitter嵌入不渲染反应本机渲染html

在 componentDidMount 之后反应不渲染组件

反应路由器不渲染组件