当前位置: 首页 > 面试题库 >

ReactJS绑定(this)

詹正浩
2023-03-14
问题内容

我正在遵循一个教程来更新ReactJS中的状态。我在本教程中碰到了这一行,但this.updateLanguage = this.updateLanguage.bind(this)我不知道发生了什么。我了解此基本知识并进行绑定,但我从未见过如此做过。有人可以解释一下吗?完整代码:

var React = require('react');

class Popular extends React.Component {
    // constructor to set default state
    constructor (props) {
        super(props);
        this.state = {
            selectLanguage: 'All'
        };
        // I don't understand this line
        this.updateLanguage = this.updateLanguage.bind(this);
    }
    // updates state
    updateLanguage(lang) {
        this.setState(() => {
            return {
                selectLanguage: lang
            }
        });
    }
    render() {
        var languages = ['All', 'JavaScript', 'Ruby', 'Java', 'CSS', 'Python'];
        return (
            <ul className='languages'>
                {languages.map((lang) => {
                    return (
                        // adds listener to current state
                        <li style={lang === this.state.selectLanguage ? {color: '#d0021b'}: null}
                            onClick={this.updateLanguage.bind(null, lang)} 
                            key={lang}>
                            {lang}
                        </li>
                    )
                })}
            </ul>
        )
    }
}

module.exports = Popular;

问题答案:

诸如click事件之类的DOM回调会将this上下文设置为DOM元素本身,在本例中为li。尝试删除您不了解的部分,然后看看会发生什么-
您会看到类似的内容this.setState is not defined,因为该功能未在li元素的上下文中定义(基本上是在寻找li.setState)。

什么bind是在该行做的是确保每当函数被调用,它会被称为与this我们想要的背景下,在这种情况下,Popular组件-
例如Popular.setState

如今,越来越多的人看到人们仅使用fat arrow语法作为保存this上下文的简写-例如,在这种情况下onClick={ () => this.updateLanguage(lang) }

(对于那些关心性能的人请注意:粗箭头方法更干净一些,但有争议,因为它在每个渲染器上反复声明该功能。也就是说,有些人声称对性能的影响很小或没有。)



 类似资料:
  • if绑定 if绑定应用在页面元素中,并通过表达式判断是否为元素添加子元素的绑定。if绑定在功能上非常像visible绑定,但在实现上却有很大的不同。visible绑定是为元素添加css样式来控制元素是否显示,if绑定是控制元素的字元素,如果表达式为true,则为元素添加子元素,否则清空子元素。 示例代码: //.W片段 <label> <input type="checkbox" bind-c

  • 诸如本地变量、实例变量、self一类的实体……或者说所有于对象绑定的名称。我们把他们称为绑定(bindings)。 下面内容摘自紫苏的博客,该文对我们的讨论很有意义。 在计算机科学中,“绑定”(Binding)一词是指一个更复杂、更大型的物件的引用的创建。例如当我们编写了一个函数,这个函数名就绑定了该函数本体,我们可以通过函数名来引用并调用该函数,这被称为名称绑定;又如当Ruby通过API去调用了

  • 问题内容: 在Python中,有没有办法绑定未绑定的方法而不调用它? 我正在编写一个程序,对于某个类,我决定将所有按钮的数据分组为类级别的元组列表是一件好事,如下所示: 问题是,因为所有的值r都是未绑定方法,所以我的程序爆炸得很厉害,我哭了。 我正在网上寻找解决方案,该方案应该是一个相对直接,可解决的问题。不幸的是我找不到任何东西。现在,我正在解决此问题,但是没有人知道是否存在一种干净,健康,Py

  • attr绑定是用来为html元素绑定属性值的,这种绑定非常有用,例如我们需要想一个元素添加title属性,或者为img标签添加src属性。 示例代码: //.W片段 <a bind-attr="{ href: url, title: details }"> Report </a> //js片段 this.url=justep.Bind.observable("year-end.html"),

  • submit绑定只能用在form元素中,当form提交的时候被触发,并且默认阻止form的提交。因此我们通常在submit的处理函数中以ajax的方式提交form表单。 示例代码: //.W片段 <form bind-submit="doSomething"> ... form contents go here ... <button type="submit">Submit</butt

  • with绑定用来创建一个绑定上下文,在子元素内的所有绑定都在这个上下文中进行。 示例代码: //.W片段 <h1 bind-text="city"> </h1> <p bind-with="coords"> Latitude: <span bind-text="latitude"> </span>, Longitude: <span bind-text="longitude"> </span