찾다
웹 프론트엔드JS 튜토리얼이것을 React 컴포넌트에 바인딩하는 이유 분석

이 글은 왜 React 컴포넌트 방식으로 바인딩되어야 하는지 알려드립니다. 내용이 매우 좋습니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

프론트엔드 개발에 React를 사용해 본 적이 있다면 다음 코드를 본 적이 있을 것입니다. React进行前端开发,一定见过下面这样的代码:

//假想定义一个ToggleButton开关组件
class ToggleButton extends React.Component{
    constructor(props){
        super(props);
        this.state = {isToggleOn: true};
        this.handleClick = this.handleClick.bind(this); 
        this.handleChange = this.handleChange.bind(this);
    }
    handleClick(){
        this.setState(prevState => ({
            isToggleOn: !preveState.isToggleOn
        }));
    }
    handleChange(){
        console.log(this.state.isToggleOn);
    }
    render(){
        return(
           <button onClick={this.handleClick} onChange={this.handleChange}>
                {this.state.isToggleOn ? &#39;ON&#39;:&#39;OFF&#39;}
            </button>
        )
    }
}

构造方法中为什么要给所有的实例方法绑定this呢?

1. 代码执行的细节

上例仅仅是一个组件类的定义,当在其他组件中调用或是使用ReactDOM.render( )方法将其渲染到界面上时会生成一个组件的实例,因为组件是可以复用的,面向对象的编程方式非常适合它的定位。根据this指向的基本规则就可以知道,这里的this最终会指向组件的实例。

组件实例生成的时候,构造器constructor会被执行,此处着重分析一下下面这行代码:

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

此时的this指向新生成的实例,那么赋值语句右侧的表达式先查找this.handleClick( )这个方法,由对象的属性查找机制(沿原型链由近及远查找)可知此处会查找到原型方法this.handleClick( ),接着执行bind(this),此处的this指向新生成的实例,所以赋值语句右侧的表达式计算完成后,会生成一个指定了this的新方法,接着执行赋值操作,将新生成的函数赋值给实例的handleClick属性,由对象的赋值机制可知,此处的handleClick会直接作为实例属性生成。总结一下,上面的语句做了一件这样的事情:

把原型方法handleClick( )改变为实例方法handleClick( ),并且强制指定这个方法中的this指向当前的实例。

2. ES5的写法中为什么不用bind(this)?

ES5的写法是指使用React.createClass( )方法来定义组件,React在V16以上的新版本中已经移除了这个API,你可以通过阅读更早版本的源代码看到这个方法的细节。

  //旧版本`react`中`createClass`方法片段
  if (this.__reactAutoBindMap) {
        this._bindAutoBindMethods();
  }

在老版本的React中,createClass()的定义中可以看到上面的代码,抛开其他复杂的逻辑,从方法名就可以看出这是一个自动绑定的方法,实际上在这个方法中所完成的,就是对组件中自定义方法的this强制绑定,感兴趣的读者可以自行翻看源码了解细节。

3. 绑定this的必要性

在组件上绑定事件监听器,是为了响应用户的交互动作,特定的交互动作触发事件时,监听函数中往往都需要操作组件某个状态的值,进而对用户的点击行为提供响应反馈,对开发者来说,这个函数触发的时候,就需要能够拿到这个组件专属的状态合集(例如在上面的开关组件ToggleButton例子中,它的内部状态属性state.isToggleOn的值就标记了这个按钮应该显示ON或者OFF),所以此处强制绑定监听器函数的this指向当前实例的也很容易理解。

React构造方法中的bind会将响应函数与这个组件Component进行绑定以确保在这个处理函数中使用this时可以时刻指向这一组件的实例。

4. 如果不绑定this

如果类定义中没有绑定this的指向,当用户的点击动作触发this.handleClick( )这个方法时,实际上执行的是原型方法,可这样看起来并没有什么影响,如果当前组件的构造器中初始化了state这个属性,那么原型方法执行时,this.state会直接获取实例的state属性,如果构造其中没有初始化state这个属性(比如React中的UI组件),说明组件没有自身状态,此时即使调用原型方法似乎也没什么影响。

事实上的确是这样,这里的bind(this)所希望提前规避的,就是著名的this指针丢失的问题

例如使用解构赋值的方式获取某个属性方法时,就会造成引用转换丢失this的问题:

const toggleButton = new ToggleButton();

import {handleClick} = toggleButton;

上例中解构赋值获取到的handleClick这个方法在执行时就会报错,Class的内部是强制运行在严格模式下的,此处的this在赋值中丢失了原有的指向,在运行时指向了undefined,而undefined是没有属性的。

另一个存在的限制,是没有绑定this的响应函数在异步运行时可能会出问题,当它作为回调函数被传入一个异步执行的方法时,同样会因为丢失了thisrrreee

왜 해야 할까요? 프론트엔드 개발을 위해 React를 사용해야 하나요? 이것을 모든 인스턴스 메소드에 바인딩하는 것은 어떻습니까? #🎜🎜#

1. 코드 실행 내용

#🎜🎜#위의 예는 다른 컴포넌트에서 호출하거나 ReactDOM.render를 사용하는 경우에 대한 정의일 뿐입니다. ( ) 메서드는 구성 요소를 인터페이스에 렌더링할 때 구성 요소의 인스턴스를 생성합니다. 구성 요소는 재사용이 가능하므로 개체 지향 프로그래밍은 구성 요소 위치 지정에 매우 적합합니다. 이 항목 지정의 기본 규칙에 따르면 여기의 이 항목이 결국 구성 요소의 인스턴스를 가리킨다는 것을 알 수 있습니다. #🎜🎜##🎜🎜#구성 요소 인스턴스가 생성되면 constructor 생성자가 실행됩니다. 여기서는 다음 코드 줄을 분석하는 데 중점을 둡니다. #🎜🎜#rrreee#🎜🎜#At 이번에는 this가 새로 생성된 인스턴스를 가리킨 다음 할당 문의 오른쪽에 있는 표현식이 먼저 this.handleClick( ) 메서드를 검색합니다. 이는 다음과 같이 결정됩니다. 객체의 속성 검색 메커니즘(근거리 및 원거리 검색에 의한 프로토타입 체인을 따라) 프로토타입 메소드 this.handleClick( )이 여기에서 발견될 것임을 알 수 있습니다. bind(this)가 실행됩니다. 여기서 this는 새로 생성된 인스턴스를 가리키므로 할당문 오른쪽의 식이 계산된 후 다음을 지정하는 새 메서드가 생성됩니다. this가 생성되고 새 함수를 추가하기 위한 할당 작업이 수행됩니다. 생성된 함수는 할당 메커니즘에 따라 인스턴스의 handleClick 속성에 할당됩니다. 객체, 여기에서 handleClick은 인스턴스 속성으로 직접 생성됩니다. 요약하면 위의 명령문은 다음과 같은 작업을 수행합니다. #🎜🎜##🎜🎜#프로토타입 메서드 handleClick( )를 인스턴스 메서드 handleClick( ) code로 변경합니다. >, 이 메서드의 <code>this가 현재 인스턴스를 가리키도록 강제합니다. #🎜🎜#

2. ES5 작성에서 왜 바인드(this)를 사용하지 않나요?

#🎜🎜#ES5 작성 방법은 React.createClass( )를 사용하는 것을 의미합니다. > 컴포넌트를 정의하는 메소드입니다. React는 V16 이상의 새 버전에서 이 API를 제거했습니다. 이전 버전의 소스 코드를 읽으면 이 메소드의 세부사항을 볼 수 있습니다. #🎜🎜#rrreee#🎜🎜#React의 이전 버전에서는 다른 복잡한 로직을 제외하고 createClass() 정의에서 위 코드를 볼 수 있습니다. 메소드 이름에서 알 수 있듯이 이는 자동 바인딩 메소드입니다. 실제로 이 메소드에서 수행되는 작업은 컴포넌트에서 사용자 정의 메소드의 를 강제로 바인딩하는 것입니다. 자세한 내용은 소스 코드를 직접 확인하세요. #🎜🎜#

3. 바인딩의 필요성

#🎜🎜#구성 요소의 이벤트 리스너 바인딩은 특정 대화형 작업이 이벤트를 트리거할 때 응답하는 것입니다. 사용자의 클릭 동작에 대한 응답 피드백을 제공하기 위해 구성 요소의 특정 상태 값을 조작하려면 개발자의 경우 이 기능이 트리거될 때 이 구성 요소에 대한 독점 상태 컬렉션을 얻을 수 있어야 합니다(예: 위 스위치 구성 요소 ToggleButton의 예에서 내부 상태 속성 state.isToggleOn의 값은 버튼이 ON 또는 OFF )이므로 필수 바인딩 리스너 함수의 this가 현재 인스턴스를 가리키는 것을 이해하기 쉽습니다. #🎜🎜#
#🎜🎜#React 생성자의 바인딩은 응답 함수를 구성 요소 구성 요소에 바인딩하여 이 핸들러 함수에서 이를 사용할 때 항상 이 구성 요소의 인스턴스를 가리킬 수 있도록 합니다. #🎜🎜#

4. 이것이 바인딩되지 않은 경우

#🎜🎜#this에 대한 포인터가 클래스 정의에 바인딩되어 있지 않으면 트리거됩니다. 사용자가 this.handleClick( )을 클릭할 때 이 메서드를 사용하면 실제로 프로토타입 메서드가 실행되지만 state하고 프로토타입 메소드가 실행될 때 this.state는 해당 속성의 state 속성을 ​​직접 얻습니다. 인스턴스 생성 시 상태 초기화가 없는 경우 이 속성(예: React의 UI 구성 요소)은 해당 구성 요소에 자체 상태가 없음을 나타냅니다. 효과가 없도록. #🎜🎜##🎜🎜#사실 이것이 사실입니다. 여기서 bind(this)가 미리 피하고 싶은 것은 이 포인터가 누락되는 유명한 문제입니다. . #🎜🎜##🎜🎜#예를 들어 특정 속성 메서드를 얻기 위해 구조 분해 할당을 사용하면 참조 변환에서 이 메서드가 손실되는 문제가 발생합니다. #🎜🎜#rrreee#🎜🎜# 위의 예에서 할당을 구조화하여 얻은 handleClick 메서드는 실행 시 오류를 보고합니다. Class의 내부는 강제로 엄격 모드에서 실행됩니다. 여기서는 이렇습니다. code>는 할당 중에 원래 포인터를 잃어 런타임에 <code>undefine을 가리키며 undefine에는 속성이 없습니다. #🎜🎜##🎜🎜# 또 다른 제한 사항은 this를 바인딩하지 않은 응답 함수가 비동기 실행 시 문제를 일으킬 수 있다는 것입니다. 콜백 함수 메서드로 비동기 실행에 전달되면 오류도 발생합니다. this에 대한 포인터가 손실되었기 때문에 발생합니다. #🎜🎜#

구성요소 인스턴스 메소드에 대해 this에 대한 필수 지정이 없으면 참조 변환 또는 을 안전하게 사용할 수 없습니다. 나중에 사용할 때 콜백 함수로 사용하세요. 전송이 방법은 이후 사용 및 공동 개발에 불편합니다. this,在将来的使用中就无法安心使用引用转换作为回调函数传递这样的方式,对于后续使用和协作开发而言都是不方便的。

5. 小结

this的使用非常灵活,但这种灵活性也带来了很多混乱。这里的bind(this)是为了改进javascript语言级的缺陷,并不是只有React中才需要这样做,这个问题是伴随着面向对象编程而产生的,在使用javascript进行插件和框架的开发时,这个问题的影响会更加明显。之所以说它是一个语言级的缺陷,是因为Java中对于this在同样场景下的指向更符合正常思维逻辑,而javascript

5. 요약

this의 사용은 매우 유연하지만 이러한 유연성은 많은 혼란을 가져옵니다. 여기서 bind(this)는 JavaScript의 언어 수준 결함을 개선하기 위한 것입니다. 이는 React에서만 필요한 것이 아닙니다. javascript를 사용할 때 발생하는 문제입니다. 이 문제의 영향은 플러그인과 프레임워크를 개발할 때 더욱 분명해집니다. 언어 수준의 결함이라고 말하는 이유는 Java의 동일한 시나리오에서 this를 가리키는 것이 일반적인 사고 논리와 더 일치하지만 >javascript 바인딩이 코드에 표시되지 않으면> 언어 연산 결과가 메소드 이름과 일치하지 않습니다. <p><br>관련 추천 : </p> <p><a href="http://www.php.cn/js-tutorial-406769.html" target="_blank" title="React中动画不生效的原因分析"></a> React에서 애니메이션이 적용되지 않는 이유 분석<br></p>#🎜🎜 ##🎜🎜 #<p>React 사용: React 구성 요소 내부의 상태 관리<a href="http://www.php.cn/js-tutorial-406756.html" target="_blank" title="React的使用:React组件内部的状态管理"></a><br></p>

위 내용은 이것을 React 컴포넌트에 바인딩하는 이유 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
파이썬과 자바 스크립트의 미래 : 트렌드와 예측파이썬과 자바 스크립트의 미래 : 트렌드와 예측Apr 27, 2025 am 12:21 AM

Python 및 JavaScript의 미래 추세에는 다음이 포함됩니다. 1. Python은 과학 컴퓨팅 분야에서의 위치를 ​​통합하고 AI, 2. JavaScript는 웹 기술의 개발을 촉진하고, 3. 교차 플랫폼 개발이 핫한 주제가되고 4. 성능 최적화가 중점을 둘 것입니다. 둘 다 해당 분야에서 응용 프로그램 시나리오를 계속 확장하고 성능이 더 많은 혁신을 일으킬 것입니다.

Python vs. JavaScript : 개발 환경 및 도구Python vs. JavaScript : 개발 환경 및 도구Apr 26, 2025 am 12:09 AM

개발 환경에서 Python과 JavaScript의 선택이 모두 중요합니다. 1) Python의 개발 환경에는 Pycharm, Jupyternotebook 및 Anaconda가 포함되어 있으며 데이터 과학 및 빠른 프로토 타이핑에 적합합니다. 2) JavaScript의 개발 환경에는 Node.js, VScode 및 Webpack이 포함되어 있으며 프론트 엔드 및 백엔드 개발에 적합합니다. 프로젝트 요구에 따라 올바른 도구를 선택하면 개발 효율성과 프로젝트 성공률이 향상 될 수 있습니다.

JavaScript가 C로 작성 되었습니까? 증거를 검토합니다JavaScript가 C로 작성 되었습니까? 증거를 검토합니다Apr 25, 2025 am 12:15 AM

예, JavaScript의 엔진 코어는 C로 작성되었습니다. 1) C 언어는 효율적인 성능과 기본 제어를 제공하며, 이는 JavaScript 엔진 개발에 적합합니다. 2) V8 엔진을 예를 들어, 핵심은 C로 작성되며 C의 효율성 및 객체 지향적 특성을 결합하여 C로 작성됩니다.

JavaScript의 역할 : 웹 대화식 및 역동적 인 웹JavaScript의 역할 : 웹 대화식 및 역동적 인 웹Apr 24, 2025 am 12:12 AM

JavaScript는 웹 페이지의 상호 작용과 역학을 향상시키기 때문에 현대 웹 사이트의 핵심입니다. 1) 페이지를 새로 고치지 않고 콘텐츠를 변경할 수 있습니다. 2) Domapi를 통해 웹 페이지 조작, 3) 애니메이션 및 드래그 앤 드롭과 같은 복잡한 대화식 효과를 지원합니다. 4) 성능 및 모범 사례를 최적화하여 사용자 경험을 향상시킵니다.

C 및 JavaScript : 연결이 설명되었습니다C 및 JavaScript : 연결이 설명되었습니다Apr 23, 2025 am 12:07 AM

C 및 JavaScript는 WebAssembly를 통한 상호 운용성을 달성합니다. 1) C 코드는 WebAssembly 모듈로 컴파일되어 컴퓨팅 전력을 향상시키기 위해 JavaScript 환경에 도입됩니다. 2) 게임 개발에서 C는 물리 엔진 및 그래픽 렌더링을 처리하며 JavaScript는 게임 로직 및 사용자 인터페이스를 담당합니다.

웹 사이트에서 앱으로 : 다양한 JavaScript 애플리케이션웹 사이트에서 앱으로 : 다양한 JavaScript 애플리케이션Apr 22, 2025 am 12:02 AM

JavaScript는 웹 사이트, 모바일 응용 프로그램, 데스크탑 응용 프로그램 및 서버 측 프로그래밍에서 널리 사용됩니다. 1) 웹 사이트 개발에서 JavaScript는 HTML 및 CSS와 함께 DOM을 운영하여 동적 효과를 달성하고 jQuery 및 React와 같은 프레임 워크를 지원합니다. 2) 반응 및 이온 성을 통해 JavaScript는 크로스 플랫폼 모바일 애플리케이션을 개발하는 데 사용됩니다. 3) 전자 프레임 워크를 사용하면 JavaScript가 데스크탑 애플리케이션을 구축 할 수 있습니다. 4) node.js는 JavaScript가 서버 측에서 실행되도록하고 동시 요청이 높은 높은 요청을 지원합니다.

Python vs. JavaScript : 사용 사례 및 응용 프로그램 비교Python vs. JavaScript : 사용 사례 및 응용 프로그램 비교Apr 21, 2025 am 12:01 AM

Python은 데이터 과학 및 자동화에 더 적합한 반면 JavaScript는 프론트 엔드 및 풀 스택 개발에 더 적합합니다. 1. Python은 데이터 처리 및 모델링을 위해 Numpy 및 Pandas와 같은 라이브러리를 사용하여 데이터 과학 및 기계 학습에서 잘 수행됩니다. 2. 파이썬은 간결하고 자동화 및 스크립팅이 효율적입니다. 3. JavaScript는 프론트 엔드 개발에 없어서는 안될 것이며 동적 웹 페이지 및 단일 페이지 응용 프로그램을 구축하는 데 사용됩니다. 4. JavaScript는 Node.js를 통해 백엔드 개발에 역할을하며 전체 스택 개발을 지원합니다.

JavaScript 통역사 및 컴파일러에서 C/C의 역할JavaScript 통역사 및 컴파일러에서 C/C의 역할Apr 20, 2025 am 12:01 AM

C와 C는 주로 통역사와 JIT 컴파일러를 구현하는 데 사용되는 JavaScript 엔진에서 중요한 역할을합니다. 1) C는 JavaScript 소스 코드를 구문 분석하고 추상 구문 트리를 생성하는 데 사용됩니다. 2) C는 바이트 코드 생성 및 실행을 담당합니다. 3) C는 JIT 컴파일러를 구현하고 런타임에 핫스팟 코드를 최적화하고 컴파일하며 JavaScript의 실행 효율을 크게 향상시킵니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구