在标签上绑定click事件,当事件内直接写表达式时,报错
当click事件绑定一个方法时,就可以正常跳转路由
是因为针对标签和方法编译时期的不同吗?
在标签上绑定click事件,当事件内直接写表达式时,报错
当click事件绑定一个方法时,就可以正常跳转路由
是因为针对标签和方法编译时期的不同吗?
在 Vue 模板中直接写表达式时,上下文环境与组件方法不同:
router
并没有挂载到组件实例的根属性上正确写法应该选择:
<!-- 方式1:使用组件方法 -->
<button @click="handleClick">跳转</button>
<!-- 方式2:显式使用 $router(模板中) -->
<button @click="$router.push('/')">跳转</button>
本质原因是 Vue 的模板编译机制:
建议采用第二种写法时注意:
因为没有 this
,像下面这样调整一下就好了。
- <el-dropdown-item icon="el-icon-setting" @click.native="this.$router.push('/user-info')" />
+ <el-dropdown-item icon="el-icon-setting" @click.native="$router.push('/user-info')" />
但是OP你既然知道在 template
里面绑定 click
时去掉了 this
,但是使用 $router
的时候没有去掉呢?
因为直接在标签上使用内联表达式时,Vue 会在特定上下文中编译这个表达式,而在这个上下文中 this
可能不是组件实例。
改成了使用 @click.native="click"
并在方法中定义 click()
函数,然后在函数内部使用 this.$router.push('/user-info')
,这样是可以正常工作的。因为在方法中,this
正确地指向了组件实例,所以可以访问到 $router
属性。
如果确实想使用内联表达式,可以使用箭头函数来保持 this
的正确引用:
<el-dropdown-item icon="el-icon-setting" @click.native="() => this.$router.push('/user-info')">
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
vue中元素标签上绑定事件可以这样写: