近期做项目开发遇到的坑,与大家分享一波!希望对各位小伙伴有帮助!
问题描述:使用render函数在表格单元格中渲染说明输入框,输入框无法输入内容
index.js(是一个公共的js方法,定义公用的render函数、方法)initial.js主要是抛出table组件colums的数据,此文件中所用的render函数从index.js中引入,initial.vue调用该index.js文件
当我们在一个js文件中使用JSX渲染组件的时候,想要让组件挂载到对应节点上,并且可以直接使用vue组件中定义的方法&变量,必须搞明白this的指向
举个例子:在initial.vue中定义了一个changeSelectedRow方法,当表格中的下拉选项发生变化的时候获取到当前行的最新数据,该下拉选项组件在以上initial.js中引用,
changeSelectedRow(row) {
this.selectedRow = row;
},
这时候想要在initial.js中直接去调用changeSelectedRow()方法,就需要拿到initial.vue的实例,改变this指向的方法有很多:
- 定义一个中间变量_this,通过 _this = this 拿到想要的this
- 通过call()、applay()、bind() 方法
- 箭头函数 () => {}
这边通过call()方法,使得该render方法的this指向initail.vue
在定义该方法的时候,一定要用function,而组件内触发的方法需要用() => {},这样this指向的实例才是同一个东西,【function和() => {} 的区别在于箭头函数的this是上下文的this,function是谁调用它,this就指向谁】
这样就可以直接调用initial.vue中定义的changeSelectedRow方法
回到正题,使用render函数在表格单元格中渲染说明输入框,输入框无法输入内容,导致出现这个问题的直接原因也是因为this指向问题,看代码就一目了然,
当触发input方法的时候,会将输入的值绑到对应的实例上
总结:当我们遇到类似的问题,一定要去看this指向,调用某个方法/组件是否挂载到对应的实例上,灵活应用js相关知识