Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

destructing directly props diffs from destructing props indirectly #11914

Open
pei-han opened this issue Sep 12, 2024 · 5 comments
Open

destructing directly props diffs from destructing props indirectly #11914

pei-han opened this issue Sep 12, 2024 · 5 comments

Comments

@pei-han
Copy link

pei-han commented Sep 12, 2024

Vue version

3.4.21

Link to minimal reproduction

https://play.vuejs.org/#eNq1VN9PwjAQ/leavjgSMxLEFxwkanjQRCXiYxOD24HDrW3aDkeW/u9eyxg/4ggvvN3u++763fVbK3ovZbgqgA5opGOVSkM0mEKOGE9zKZQhFVEwJ5bMlcjJFVKvGmhafNXpsIux63MA9vbRXg3HgmtDyrIkQ1Kt1+sBtg8q27GMR92NBDwcPwzkMpsZwC9CoiRd+QBDd+wAK4eMYpsQI0ZJdw/ttcFRd9vGHbZ3AL2mRqOyeboIl1pwXEflaTQWuUwzUG/SpKic0QHxiMNmWSZ+n33OqAKut/n4G+Kff/JLXbocoxMFGtQKGG0wM1MLMBt4PH2FEuMGzEVSZMg+Ab6DFlnhNG5oDwVPUPYez6t98peT8sWHHpcGuN4O5YQ6pvV8RvGyHk+MvpN7E/Z9HeMWt1jbAPeHG24xlOAvouAGkjZTHflqZ62Nd5xrLLongXnKYaKE1IF3UmVth/GmfRB0hiOv2NWJDMJMLALmNOJasADJruCU7Wo1tZ+8l0ZRLQoZxyba+vyi80s3cfv8h0vyZDfYOWvpXXAvO2e0PjSNxIPn5u7Mez9vxLMv/3iEzxUo97fgADfhbdin9g9aLM7Z

Steps to reproduce

https://play.vuejs.org/#eNq1VN9PwjAQ/leavjgSMxLEFxwkanjQRCXiYxOD24HDrW3aDkeW/u9eyxg/4ggvvN3u++763fVbK3ovZbgqgA5opGOVSkM0mEKOGE9zKZQhFVEwJ5bMlcjJFVKvGmhafNXpsIux63MA9vbRXg3HgmtDyrIkQ1Kt1+sBtg8q27GMR92NBDwcPwzkMpsZwC9CoiRd+QBDd+wAK4eMYpsQI0ZJdw/ttcFRd9vGHbZ3AL2mRqOyeboIl1pwXEflaTQWuUwzUG/SpKic0QHxiMNmWSZ+n33OqAKut/n4G+Kff/JLXbocoxMFGtQKGG0wM1MLMBt4PH2FEuMGzEVSZMg+Ab6DFlnhNG5oDwVPUPYez6t98peT8sWHHpcGuN4O5YQ6pvV8RvGyHk+MvpN7E/Z9HeMWt1jbAPeHG24xlOAvouAGkjZTHflqZ62Nd5xrLLongXnKYaKE1IF3UmVth/GmfRB0hiOv2NWJDMJMLALmNOJasADJruCU7Wo1tZ+8l0ZRLQoZxyba+vyi80s3cfv8h0vyZDfYOWvpXXAvO2e0PjSNxIPn5u7Mez9vxLMv/3iEzxUo97fgADfhbdin9g9aLM7Z in above example.
The component Sub and Sub2 both bind xxx.yyy.Destruct yyy directly in Sub component,however do it indirectly in Sub.
Both two have the same child component SubSub,but console.log outputs different result yyy in two SubSub,one is RefImpl,other is Proxy.
Look at the screenshot below.
image

What is expected?

two SubSub console.log output the same result.

What is actually happening?

Be different

System Info

System:
    OS: Windows 11 10.0.22000
    CPU: (8) x64 Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz
    Memory: 1.27 GB / 7.91 GB
  Binaries:
    Node: 18.20.3 - D:\devtools\nodejs\node.EXE
    npm: 8.19.2 - D:\devtools\nodejs\npm.CMD

Any additional comments?

No response

@coderwei99
Copy link
Contributor

I looked into it, but I don't know if the subsub component should get the ref or reactive. Do you think? @edison1105

@linzhe141
Copy link
Contributor

Although const {yyy} = defineProps({yyy:{}}) and const props = defineProps({yyy:{}});const {yyy} = props appear to be the same, they are actually compiled into completely different code

vuejs/rfcs#502 (comment)

image

@edison1105 edison1105 added need discussion and removed 🐞 bug Something isn't working scope: compiler labels Sep 14, 2024
@pei-han
Copy link
Author

pei-han commented Sep 14, 2024

First of all,thanks for you all.
Although there was the same outputs like my playground example in latest version yet,but thank a lot for @linzhe141 .
Then i have found the reason to appear this phenomenon,and the official website doc of vue also metion the corresponding knowledge.
Screenshot below from vue officail doc.
image

@pei-han
Copy link
Author

pei-han commented Nov 10, 2024

Through the example above,i guess the returned object of defineProps function should be a special shallowReactive one.
Please confirm my thought, i would appreciate that.
I have authored a vue playground example,below.

https://play.vuejs.org/#eNq1VE1v2zAM/SuCLnUAw8HS7uI5Abahhw3YVrQ7Chgym0nd2ZIgyZ4DQ/99lPwRx2uCXHoKpUdSfM+PaelHKaO6AhrTRKcql4ZoMJXcMJ6XUihDWqJgR0L9vC0K8fcRtqnJa7Bkp0RJbrD0Zkx9qn7319ESY9f3BFxN0VUPp4JrQ5qmIWvSHg6HGJ8LWruwA6QRmL0etIwTMkkO3Rl7xL5Da7HYLroGooCoEPuAOapEMxpqRJJlxxZ54sFAKYutATwRkmR57QMMHaMYW64Zxe4RRoyS5QRd/Q/HGOJF28Tv7JidLIeu7u3JezSkRuOcu3wfvWjB8UN4coymopR5AeqHNDnyYDQmHnGYV+OrvzOqAk/f1zxD+ueV+xfduDtGHxRoUDWgDANmtmoPpoPvn75Dg/EIliKrCsy+AD4Caly5Gbu0TxXPcOxJnp/2i7dBzvc/9X1jgOuBlBvUZVqfzyja4vMF6sdxb6M7X4ffGlXsDYf6ocJnrCz4N1FxA9k5+84cfDRxZ0XnLot2zGCXc3hQQupgcByaamwfBIv1xk986kDsh7JgASa7gksu7Kfp7eWttUn6oTBjbqJho96Uv3SMX+cf+u3zMpxq5Wvmq+g3p0No6H+vlG/1hvodHXT2r3AckUwV/HClP66jeLVJ5hR+1aDcViGB2+h9dEftP8gHCU0=

There is a shallowReactive object named s in App component,and logout this object displayed in screenshot below.
image

I also logout the props of Sub2 component in which there are two properites xxx and yyy. You can see the props object is a special nested proxy.
image

@linzhe141
Copy link
Contributor

linzhe141 commented Nov 11, 2024

Through the example above,i guess the returned object of defineProps function should be a special shallowReactive one. Please confirm my thought, i would appreciate that. I have authored a vue playground example,below.

https://play.vuejs.org/#eNq1VE1v2zAM/SuCLnUAw8HS7uI5Abahhw3YVrQ7Chgym0nd2ZIgyZ4DQ/99lPwRx2uCXHoKpUdSfM+PaelHKaO6AhrTRKcql4ZoMJXcMJ6XUihDWqJgR0L9vC0K8fcRtqnJa7Bkp0RJbrD0Zkx9qn7319ESY9f3BFxN0VUPp4JrQ5qmIWvSHg6HGJ8LWruwA6QRmL0etIwTMkkO3Rl7xL5Da7HYLroGooCoEPuAOapEMxpqRJJlxxZ54sFAKYutATwRkmR57QMMHaMYW64Zxe4RRoyS5QRd/Q/HGOJF28Tv7JidLIeu7u3JezSkRuOcu3wfvWjB8UN4coymopR5AeqHNDnyYDQmHnGYV+OrvzOqAk/f1zxD+ueV+xfduDtGHxRoUDWgDANmtmoPpoPvn75Dg/EIliKrCsy+AD4Caly5Gbu0TxXPcOxJnp/2i7dBzvc/9X1jgOuBlBvUZVqfzyja4vMF6sdxb6M7X4ffGlXsDYf6ocJnrCz4N1FxA9k5+84cfDRxZ0XnLot2zGCXc3hQQupgcByaamwfBIv1xk986kDsh7JgASa7gksu7Kfp7eWttUn6oTBjbqJho96Uv3SMX+cf+u3zMpxq5Wvmq+g3p0No6H+vlG/1hvodHXT2r3AckUwV/HClP66jeLVJ5hR+1aDcViGB2+h9dEftP8gHCU0=

There is a shallowReactive object named s in App component,and logout this object displayed in screenshot below. image

I also logout the props of Sub2 component in which there are two properites xxx and yyy. You can see the props object is a special nested proxy. image

In fact, defineProps is just a compilation tool, and props is indeed a shallowReactive
https://github.com/vuejs/core/blob/main/packages/runtime-core/src/componentProps.ts#L216~L218

In Sub.vue, it is compiled into { yyy: $props.yyy }, but vue will only perform possible ref unwrap processing on setupState (instance.setupState = proxyRefs(setupResult)), even though $props.yyy is a ref, it will not be unwrapped

image

In Sub2.vue, it is compiled into { yyy: $setup.yyy }, so the ref is unwrapped

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants