【问题标题】:expanding javascript(ES6) arrow notation (shorthand) to full syntax?将javascript(ES6)箭头符号(速记)扩展为完整语法?
【发布时间】:2018-02-08 20:53:24
【问题描述】:

我对 javascript 比较陌生,并且一直在学习 React。我遵循了一些使用 fetch() 从 React 中的 API 获取数据的教程。该教程当然工作得很好,当使用不同的 API 重新创建它时,我花了几个小时才弄清楚如何重现它,甚至复制速记代码,所以我一直在尝试扩展这个代码,所以我可以准确地理解什么是继续。

fetch(request)
    .then(response => response.json())
    .then(data => { 
        let drinkNames = data.data.map(
            (dataSelect) => {
            return (
                <div key={dataSelect.data}>
                {dataSelect.name}
                </div >
            )
        })
        this.setState({drinks:drinkNames});
    })

这是速记代码,它包含看起来像返回其他函数的嵌入函数,但是当我尝试扩展它时,我尝试的所有操作都会给我一个错误,我想了解发生了什么。谁能帮我扩展该代码?

我从文档中了解到,在其基本使用中,箭头函数返回括号中的内容。按照这个逻辑,我尝试了

then(function(data){

        function longhand(){
            let drinkNames = data.data.map(
            (dataSelect) => {
                return (
                    <div key={dataSelect.data}>
                    {dataSelect.name}
                    </div >
                )
            })
        }

        return longhand();

这显然不起作用,而且我的新 longhand() 函数中似乎还有另一个速记箭头函数,所以我总体上有点困惑。帮忙?

【问题讨论】:

  • 您要扩展什么,遇到什么错误?只是一个提示,开始使用在线工具(如 codesandbox 或 codepen)开始工作/测试,它可以让您轻松分享您的代码并帮助我们了解您想要做什么
  • 谢谢,我会尝试这样做。我正在尝试扩展 .then(data => ... 中的内容,直到 "this.setState({drinks:drinkNames})" 代码有效,但我不太明白它是如何工作的,这就是为什么我要扩展
  • 你想在 Promise 结果中渲染 react,这是不允许的。 React 组件应该总是同步渲染。您可以使用setState 将数据传递给组件的渲染函数。就像我说的,请在代码沙盒上创建一个示例项目。有很多入门项目。
  • 箭头函数没有自己的this - 相反,this 是封闭执行上下文的this - 如果您想正确地将 es6+ 扩展为 es5,请使用转译器,例如通天塔。但是请注意,“脱离上下文”的小代码 sn-ps 会导致代码不太正确,尤其是关于 this
  • 我按照您的建议制作了代码和框文件,但问题在于即时连接的 API 不是 https,因此无法获取。无论如何,如果你想看到完整的代码,即使它不会呈现。代码本身确实有效,我只是想扩展它,以便我可以破译发生了什么:/ - >代码框codesandbox.io/s/j34rk6pyq3

标签: javascript reactjs syntax ecmascript-6


【解决方案1】:

箭头函数以下列方式展开:

then(data =&gt; data.id)

等于:

then(function(data) {
    return data.id
});

因此,您在 ES5 语法中的原始代码如下所示:

fetch(request)
    .then(function(response) {
        return response.json()
    })
    .then(function(data) { 
        let drinkNames = data.data.map(function(dataSelect) {
            return (
                <div key={dataSelect.data}>
                    {dataSelect.name}
                </div >
            )
        })
        this.setState({drinks:drinkNames});
    })

更新:

正如评论中正确提到的那样,this 的上下文将会改变,因为与常规函数不同的箭头函数不会创建自己的上下文。如果没有看到您的整个组件,我无法 100% 确定地告诉您 this 将更改为什么,但是我怀疑它将是 Window 或未定义的。 您始终可以使用Function.prototype.bind 明确告诉函数this 应该引用什么。

【讨论】:

  • 这几乎是对的,除了this.setState 中的this 将是undefined全局对象(其中哪个将取决于其他因素) - 从技术上讲,如果你想要相同的功能,你应该在 fetch 之前添加var _this = this,并使用_this.setState
猜你喜欢
  • 2020-02-24
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 2019-01-06
相关资源
最近更新 更多