首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能使用const/let中的React组件?

为什么我不能使用const/let中的React组件?
EN

Stack Overflow用户
提问于 2020-01-27 09:03:38
回答 4查看 9.1K关注 0票数 1

我像以前一样使用create-react-app启动了一个Reactjs项目。这一次它不允许我在类主体中使用const/let。我正在尝试在MdAddShoppingCart图标上创建一个单击处理程序MdAddShoppingCart。如果我使用constlet,它会说:

未能编译./src/ProductListingPage.js

第8:11行:解析错误:意外令牌

6\x类ProductListingPage扩展了React.Component {7~++8~_

9连console.log("In addToCart")

分派({ type:"ADD_TO_CART“});

[ 11 ]

如果我不使用这些关键字并像这样定义函数签名:

代码语言:javascript
复制
addToCart = () => {}

上面写着:

第24:65行:“addToCart”未定义为no-undef

我不能做出这种行为。任何帮助都将不胜感激。下面是相关代码。

ProductListingPage.js

代码语言:javascript
复制
import React from 'react';
import { connect } from 'react-redux';
import { MdAddShoppingCart } from "react-icons/md";
import { Grid, Row, Col } from 'react-flexbox-grid';

class ProductListingPage extends React.Component {

addToCart = () => {
    console.log("In addToCart")
    //store.dispatch({ type: "ADD_TO_CART" });
}
render() {
    return (
        <React.Fragment>
            <h3>Product Listing Page</h3>
            <ol>
                {this.props.products.map((product, index) =>
                    <Grid fluid>
                        <Row>
                            <Col>
                                <li key={index}>{product}</li>
                            </Col>
                            <Col>
                                <MdAddShoppingCart onClick={addToCart} /> //line 24
                            </Col>
                        </Row>

                    </Grid>
                )}
            </ol>
        </React.Fragment>
    );
}
}

function mapStateToProps(state) {
return {
    ...state,
    products: state.products
};
}
export default connect(mapStateToProps)(ProductListingPage);

Package.json

代码语言:javascript
复制
      {
    "name": "cart-screen",
    "version": "0.1.0",
    "private": true,
    "dependencies": {
      "react": "^16.12.0",
      "react-dom": "^16.12.0",
      "react-flexbox-grid": "^2.1.2",
      "react-icons": "^3.8.0",
      "react-redux": "^7.1.3",
      "react-scripts": "3.3.0",
      "reactstrap": "^8.4.0",
      "redux": "^4.0.5"
    },
    "scripts": {
      "start": "./node_modules/react-scripts/bin/react-scripts.js start",
      "start:prod": "pushstate-server build",
      "build": "./node_modules/react-scripts/bin/react-scripts.js build",
      "test": "./node_modules/react-scripts/bin/react-scripts.js test --env=jsdom",
      "eject": "./node_modules/react-scripts/bin/react-scripts.js eject",
      "server": "cd client/api && pm2 start server.js --watch",
      "proxy": "http://128.199.139.144:3000"
    },
    "browserslist": {
      "production": [
        ">0.2%",
        "not dead",
        "not op_mini all"
      ],
      "development": [
        "last 1 chrome version",
        "last 1 firefox version",
        "last 1 safari version"
      ]
    }
  }
EN

回答 4

Stack Overflow用户

发布于 2020-01-27 09:44:32

我明白你在说什么,

您不能用let或const声明addToCart,因为您处理的不是类内的函数,而是类方法(与object.prototype.method非常类似)。

代码语言:javascript
复制
//wrong..
class x extends Component {
 let y = () => {}
}


//correct..
class x extends Component {
 y = () => {}
 z() {}
}

另外,为了使用y和z,您可以在jsx内使用这个.y/z,或者只需将其从这个类的中解构,

代码语言:javascript
复制
constructor(props) {
super(props)
 this.z = this.z.bind(this)
}

render() {
 const { z, y } = this

 return (
  <div>
   <div onClick={() => y()} ...rest of the div.../>
   <div onClick={() => z()} ...rest of the div.../>
  </div>
 )
}

或者只是..。

代码语言:javascript
复制
render() {
 return (
  <div onClick={() => this.y()} ..../>
  //<div onClick={this.y} ...will also do if you don't want to pass any params..../>
 )
}

由于箭头函数语法本身没有任何--这个透视图,所以您可以简单地使用它。但是,如果您处理的是像z这样的函数声明,它不会从父函数继承这个透视图,所以必须将其绑定到构造函数中的父函数。

票数 3
EN

Stack Overflow用户

发布于 2020-01-27 09:11:50

您需要将addToCart函数的引用作为在此Class中定义的函数提供,因此需要使用this.addToCart而不是-:

代码语言:javascript
复制
<Col>
    <MdAddShoppingCart onClick={this.addToCart} /> //line 24
</Col>

另外,constlet不能工作,因为这是一个Class而不是function

如果我们定义这样的-:

代码语言:javascript
复制
class ProductListingPage extends React.Component {

    addToCart = () => {
        console.log("In addToCart")
    }
    render() {
        return (
            <React.Fragment>
                <h3>Product Listing Page</h3>
            </React.Fragment>
        );
    }
}

它转化为这个-:

代码语言:javascript
复制
function ProductListingPage(){
    //constructor code
}

和,

代码语言:javascript
复制
ProductListingPage.prototype.addToCart = function () {
    console.log("In addToCart");
}

随后,对于呈现函数也是如此,但唯一不同的是render函数是从React.Component类继承来的。

票数 2
EN

Stack Overflow用户

发布于 2020-01-27 09:09:59

代码语言:javascript
复制
<MdAddShoppingCart onClick={this.addToCart} />

使用它访问类成员

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59927856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档