Reactjs 拥有.bind()的目的
我不明白为什么在react应用程序中使用.bind()操作。我注意到大多数开发人员在他们的代码中都使用它,而且如果没有这个操作,我也会出错。添加bind()操作后,成功编译代码。但是我不知道为什么要使用它,也不知道.bind()操作做了什么 //App.jsReactjs 拥有.bind()的目的,reactjs,Reactjs,我不明白为什么在react应用程序中使用.bind()操作。我注意到大多数开发人员在他们的代码中都使用它,而且如果没有这个操作,我也会出错。添加bind()操作后,成功编译代码。但是我不知道为什么要使用它,也不知道.bind()操作做了什么 //App.js import React, { Component } from 'react'; import logo from './resources/metro-library-3.jpg'; import './App.css
import React, { Component } from 'react';
import logo from './resources/metro-library-3.jpg';
import './App.css';
import Table from './components/bookTable.js';
import Footer from './components/footer.js';
import Header from './components/header.js';
class App extends Component {
constructor(props){
super(props);
this.setSelectedAuthor = this.setSelectedAuthor.bind(this);
this.updateFooter = this.updateFooter.bind(this);
this.state = {
authors: [],
selectedAuthor: "select author",
footerBook: {
name: "",
author: ""
}
}
}
setSelectedAuthor(author){
this.setState({
selectedAuthor: author
}, () =>{
this.setState({selectedAuthor: author});
console.log(this.state.selectedAuthor);
})
console.log(author);
}
updateFooter(book){
this.setState({
footerBook: book
})
}
componentDidMount(){
let url = 'http://localhost:8083/getAll';
let auth = [];
fetch(url).then(response => response.json()).then((data) => {
data.bdata.map((book) =>{
auth.push(book.author)
})
this.setState({
authors: auth
})
})
}
render() {
return (
<div className="App">
<select value={this.state.selectedAuthor} onChange={(e) => this.setSelectedAuthor(e.target.value)}>
<option value="select author">Select Author</option>
{
this.state.authors.map((author, key) =>
<option key={key} value={author}>{author}</option>
)
}
</select>
<Table filterBook = {this.state.selectedAuthor} update = {this.updateFooter}/>
<Footer book={this.state.footerBook}/>
</div>
);
}
}
export default App;
import React,{Component}来自'React';
从“/resources/metro-library-3.jpg”导入徽标;
导入“/App.css”;
从“./components/bookTable.js”导入表;
从“./components/Footer.js”导入页脚;
从“./components/Header.js”导入标题;
类应用程序扩展组件{
建造师(道具){
超级(道具);
this.setSelectedAuthor=this.setSelectedAuthor.bind(this);
this.updateFooter=this.updateFooter.bind(this);
此.state={
作者:[],
selectedAuthor:“选择作者”,
页脚簿:{
姓名:“,
作者:“
}
}
}
setSelectedAuthor(作者){
这是我的国家({
所选作者:作者
}, () =>{
this.setState({selectedAuthor:author});
console.log(this.state.selectedAuthor);
})
console.log(作者);
}
updateFooter(书籍){
这是我的国家({
书
})
}
componentDidMount(){
让url为空http://localhost:8083/getAll';
设auth=[];
获取(url)。然后(response=>response.json())。然后((数据)=>{
data.bdata.map((书)=>{
auth.push(book.author)
})
这是我的国家({
作者:auth
})
})
}
render(){
返回(
this.setSelectedAuthor(e.target.value)}>
选择作者
{
this.state.authors.map((author,key)=>
{作者}
)
}
);
}
}
导出默认应用程序;
//AppContainer.js
import React, {Component} from 'react';
import {BrowserRouter as Router} from 'react-router-dom';
import Route from 'react-router-dom/Route'
import App from '../App';
import Header from '../components/header.js';
import AddBooks from "../components/AddBooks";
class AppContainer extends Component{
render(){
return(
<Router>
<div>
<Route path = "/" component={Header}/>
<Route exact path = "/" component={App}/>
<Route exact path = "/addBook" component={AddBooks}/>
</div>
</Router>
);
}
}
export default AppContainer;
import React,{Component}来自'React';
从“react Router dom”导入{BrowserRouter as Router};
从“反应路由器dom/路由”导入路由
从“../App”导入应用程序;
从“../components/Header.js”导入标题;
从“./components/AddBooks”导入AddBooks;
类AppContainer扩展组件{
render(){
返回(
);
}
}
导出默认AppContainer;
@Chamali阅读此文了解情况
绑定功能
JavaScript中的绑定函数是一个绑定到给定上下文的函数。这意味着无论您如何称呼它,调用的上下文都将保持不变。唯一的例外是new操作符,它总是返回一个新上下文
要从常规函数中创建有界函数,请使用bind方法。bind方法将要将函数绑定到的上下文作为第一个参数。其余参数是始终传递给此类函数的参数。它返回一个有界函数作为结果。让我们看一个例子:
function add(x, y) {
this.result += x + y;
}
var computation1 = { result: 0 };
var boundedAdd = add.bind(computation1);
boundedAdd(1, 2); // `this` is set to `computation1`.
// computation1 after call: { result: 3 }
var boundedAddPlusTwo = add.bind(computation1, 2);
boundedAddPlusTwo(4); // `this` is set to `computation1`.
// computation1 after call: { result: 9 }
即使手动调用call和apply,也无法更改有界函数!参见以下示例:
var obj = { boundedPlusTwo: boundedAddPlusTwo };
obj.boundedPlusTwo(4); // `this` is set to `computation1`.
// even though method is called on `obj`.
// computation1 after call: { result: 15 }
var computation2 = { result: 0 };
boundedAdd.call(computation2, 1, 2); // `this` is set to `computation1`.
// even though context passed to call is
// `computation2`
// computation1 after call: { result: 18 }
您现在已经掌握了有关JavaScript的这些知识。让我们跳到React组件类,看看函数调用上下文如何影响代码
希望这能消除您的疑虑。TL:DR版本将应用程序类方法的上下文设置为与应用程序类上下文相同。用法:
this.setState
,this.props
,等等。可能的副本至少有3种方法可以在不使用绑定的情况下执行相同操作。要理解为什么我们必须绑定
,意味着您必须理解这个如何在Javascript函数中工作。