Antd Pro中Reactjs的代码出现警告:
componentDidMount() { this.updateFunctionGroupsList(this.fetchFunctionGroupCallback) } updateFunctionGroupsList(callback=undefined){ ... if(callback) { this.props.dispatch({ type: 'functionGroup/fetch', payload: curQueryParamDict, }).then(callback(this)); }else { this.props.dispatch({ type: 'functionGroup/fetch', payload: curQueryParamDict, }) } } fetchFunctionGroupCallback(curThis){ // console.log(`fetchFunctionGroupCallback: this=`, this) console.log(`fetchFunctionGroupCallback: curThis=`, curThis) const { functionGroup: { functionGroups } } = curThis.props; console.log(`fetchFunctionGroupCallback: functionGroups=`, functionGroups) if (functionGroups.results){ const functionGroupList = functionGroups.results console.log("functionGroupList=", functionGroupList) curThis.updateGroupAndMember(functionGroupList) } }
出现警告:
[eslint] Expected 'this' to be used by class method 'fetchFunctionGroupCallback'. (class-methods-use-this)
然后之前是参考别的做法,去加上了:
/* eslint-disable class-methods-use-this */ /* eslint-disable class-methods-use-this */
很明显:只是取消了警告,没有根本的解决问题。
后来想到了,参考别的代码:
onChange={this.onGroupListChange.bind(this, this.state.groupList)}
在调用时,加上this的bind:
this.updateFunctionGroupsList(this.fetchFunctionGroupCallback.bind(this))
然后callback中,好像也就可以用this了。
好像代码可以继续优化,把bind放在callback调用的地方:
this.updateFunctionGroupsList(this.fetchFunctionGroupCallback) if(callback) { this.props.dispatch({ type: 'functionGroup/fetch', payload: curQueryParamDict, }).then( // callback(this) callback.bind(this) );
也就可以优化,去掉curThis,直接用this了:
// fetchFunctionGroupCallback(curThis){ fetchFunctionGroupCallback(){ console.log(`fetchFunctionGroupCallback: this=`, this) // console.log(`fetchFunctionGroupCallback: curThis=`, curThis) const { functionGroup: { functionGroups } } = this.props; console.log(`fetchFunctionGroupCallback: functionGroups=`, functionGroups) if (functionGroups.results){ const functionGroupList = functionGroups.results console.log("functionGroupList=", functionGroupList) this.updateGroupAndMember(functionGroupList) } }
结果:
是可以的,可以把this传递过去:
【总结】
此处Antd Pro的Reactjs中,想要在callback中使用this,且避免eslint的警告:
[eslint] Expected 'this' to be used by class method (class-methods-use-this)
的做法是:
在callback时,加上bind的this:
this.updateFunctionGroupsList(this.fetchFunctionGroupCallback) // updateFunctionGroupsList(queryParamDict = {}, callback=undefined){ updateFunctionGroupsList(callback=undefined){ // console.log("updateFunctionGroupsList: queryParamDict=", queryParamDict, ", callback=", callback) console.log("updateFunctionGroupsList: callback=", callback) // Note: here only get SCRIPT function group, omit ADMIN function group const FUNCTION_GROUP_FUNCTION_SCRIPT = "1" // const curQueryParamDict = queryParamDict // curQueryParamDict.function = FUNCTION_GROUP_FUNCTION_SCRIPT const curQueryParamDict = { "function": FUNCTION_GROUP_FUNCTION_SCRIPT, } // // Note: when get group list, not consider group_id // if (curQueryParamDict.group_id) { // delete curQueryParamDict.group_id // } console.log(`curQueryParamDict=`, curQueryParamDict) if(callback) { this.props.dispatch({ type: 'functionGroup/fetch', payload: curQueryParamDict, }).then( callback.bind(this) ); }else { this.props.dispatch({ type: 'functionGroup/fetch', payload: curQueryParamDict, }) } } fetchFunctionGroupCallback(){ console.log(`fetchFunctionGroupCallback: this=`, this) const { functionGroup: { functionGroups } } = this.props; console.log(`functionGroups=`, functionGroups) if (functionGroups.results){ const functionGroupList = functionGroups.results console.log("functionGroupList=", functionGroupList) this.updateGroupAndMember(functionGroupList) } }
【后记】
突然发现,此处另外的函数,还是提示同样的警告:
然后才看懂:
提示你这个函数里面,一定要用this
而此处函数中,没有用到this,所以警告。
但是觉得很怪,为何要求我一定要用this呢?
难道是属于Reactjs的类的内部,就一定要用?
或许把函数放到类的外部,就可以消除警告了?
[eslint] Expected ‘this’ to be used by class method (class-methods-use-this)
所以解决办法是:
要么是代码里面避免,函数里面没有用到this
要么把函数变成static -》 然后调用的时候就要写成:ClassName.xxx 了
要么是,去.eslintrc.js添加规则,禁止掉:
{ 'rules': { "class-methods-use-this": "off", } }
此处选择第二种,变成static
static getGroupMemberList(groupList, selectedGroupId) { ... }
别处之前用this去调用的:
export default class AllScriptList extends PureComponent { const curGroupMemberList = this.getGroupMemberList(groupList, value) }
现在就要改为:
export default class AllScriptList extends PureComponent { const curGroupMemberList = AllScriptList.getGroupMemberList (groupList, value) }
了。
【后记2】
关于this的绑定,后来发现,自己搞错了,原先的代码改为:
componentDidMount() { this.fetchFunctionGroupCallback = this.fetchFunctionGroupCallback.bind(this) this.fetchFunctionGroupsList(this.fetchFunctionGroupCallback) }
才可以确保,最终的fetchFunctionGroupCallback时,this是全局的this,而不是undefined。
其中最佳做法是在constructor中而不是componentDidMount,去给函数加上bind this会更好。
转载请注明:在路上 » 【已解决】Reactjs警告:[eslint] Expected ‘this’ to be used by class method (class-methods-use-this)