辛苦老师帮我看一下,为什么会报这个问题呀(已声明变量报undefined)

辛苦老师帮我看一下,为什么会报这个问题呀(已声明变量报undefined)

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Document</title>

<script src="https://unpkg.com/vue@next"></script>

<style>

   </style>

</head>

<body>

<div id="root"></div>

</body>

<script>

  let app = Vue.createApp({

       setup(props, context){

           const {ref,provide} = Vue;

           const name = ref(name);

           provide('name', name);

           provide('changeName',(value)=>{

               name.value = value;

           })

           return {name,changeName}

       },

       template:`

           <div>

              <child></child>

           </div>

        `

   });

   app.component('child',{

       setup(){

           const {inject} = Vue;

           const name = inject('name','hello'); // 如果name没有拿到,那么默认值就是hello

           const changeName = inject('changeName');

           let changePN = ()=>{

               changeName('Tina')

           }

           return {name,changeName}

       },

       template: '<div @click="changePN">{{name}}</div>'

   })


   const vm = app.mount('#root');

</script>

</html>

相关截图:

https://img1.sycdn.imooc.com/climg/655dbd720921c38612221412.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,问答区粘贴的代码,测试后发现,报错不止一个,具体如下:

1、打开页面,首先报如下错误:

https://img1.sycdn.imooc.com/climg/655dbff2095c064409090135.jpg

报错意思是“不能在声明name之前,就使用name”,简单理解就是"变量的使用顺序发生了错误"

https://img1.sycdn.imooc.com/climg/655dc06e0914d45006670271.jpg

修改如下:

https://img1.sycdn.imooc.com/climg/655dc0b809c120ff09060320.jpg

2、继续报如下错误:

https://img1.sycdn.imooc.com/climg/655dc0c60947f34207520144.jpg

原因是app组件中并没有声明变量changeName,所以无法导出changeName。provide只是注入变量,并不是在自身里面声明一个变量:

https://img1.sycdn.imooc.com/climg/655dc17c091bccf509530549.jpg

修改如下:

https://img1.sycdn.imooc.com/climg/655dc1bc09baf2e207760614.jpg

3、子组件模版中使用了变量changePN,但是没有导出该变量,代码效果不对:

https://img1.sycdn.imooc.com/climg/655dc2020928f8b608940712.jpg

修改如下:

https://img1.sycdn.imooc.com/climg/655dc235090d712608360763.jpg

祝学习愉快!

  • Tinaisbest 提问者 #1

    谢谢老师的耐心解答,超级感谢https://img1.sycdn.imooc.com/climg/655dc50b09d8a32e17041052.jpg老师的代码里没有声明changeName 只是注入了changeName 为啥不报错呢?我的却报错了

    2023-11-22 17:09:09
  • 好帮手慕久久 回复 提问者 Tinaisbest #2

    认真看之前的第二条回复,再给同学补充一下:setup中的return关键字,导出的是,组件中声明的变量。provide是注入内容,并不是声明变量。讲师代码中,没有声明changName,也没有导出changName,所以肯定不报错:

    https://img1.sycdn.imooc.com/climg/655dc73a0970e44713120668.jpg

    2023-11-22 17:18:59
  • 好经典的问题和回答,学习了,

    =====( ̄▽ ̄*) 顶贴,

    2024-01-14 18:18:04
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师