请教一个 vue 中组件复用的问题

讨论 未结 19 28
yezheyu
yezheyu 会员 2022年9月27日 08:47 发表
<p>如何让复用的组件内部代码随着切换多次执行呢?</p> <p>App.vue 组件:有两个按钮,点击按钮下面 div 显示对应按钮中的文字</p> <pre><code>&lt;template&gt; &lt;button @click="changeData($event)"&gt;user1&lt;/button&gt; &lt;button @click="changeData($event)"&gt;user2&lt;/button&gt; &lt;User :name="data"&gt;&lt;/User&gt; &lt;/template&gt; &lt;script setup&gt; import { ref } from 'vue'; import User from './components/user.vue'; let data = ref('') function changeData(e) { data.value = e.target.innerText } &lt;/script&gt; </code></pre> <p>User.vue 组件:</p> <pre><code>&lt;template&gt; &lt;div&gt; {{ name }} &lt;/div&gt; &lt;!-- &lt;div&gt; {{ attrs.name }} &lt;/div&gt; --&gt; &lt;/template&gt; &lt;script setup&gt; import { useAttrs } from 'vue'; let attrs = useAttrs() let name = attrs.name console.log(name); &lt;/script&gt; </code></pre> <br> User 组件内部的代码只会执行一次,`console.log` 不会随着 button 的点击事件执行多次,不符合预期 <p>如果在 template 中直接使用 <code><a href="http://attrs.name" rel="nofollow">attrs.name</a></code> 是没问题的,不会丢失响应式</p> <p>如果使用变量 name 接收,因为组件内部代码只执行一次的缘故,就不能实现切换文字效果</p> <p>如何才能让 User 组件内部的代码随着 button 点击多次执行呢?</p>
收藏(0)  分享
相关标签: 灌水交流
注意:本文归作者所有,未经作者允许,不得转载
19个回复
  • cydysm
    2022年9月27日 09:19
    凑活看吧 <template> <div> {{ name }} </div> </template> <script setup> import {watch} from 'vue' let props = defineProps({ name:String }) watch(, (val) => { console.log(val) }) </script>
    0 0
  • HugoChao
    2022年9月27日 09:19
    看了半天都怀疑自己有没有学 vue 了,发现是 vue3 语法
    0 0
  • EyebrowsWhite
    2022年9月27日 09:19
    接 4 楼, 可以不用 watch, 用 toRef 或者 toRefs, `const name = toRef(props, 'name')`
    0 0
  • EyebrowsWhite
    2022年9月27日 09:19
    额, 好吧, 没看清楚, 如果要是想运行 console 的话, 还是要 watch 的
    0 0
  • yezheyu
    2022年9月27日 09:19
    @ 就是说把需要变化的逻辑写在 watch 中是吗
    0 0
  • EyebrowsWhite
    2022年9月27日 09:19
    是的,如果你想在某个值变化之后执行一些逻辑,那么这些逻辑要写在 watch 里面
    0 0
  • cydysm
    2022年9月27日 09:19
    setup 简单理解取代了 beforecate 和 created ,只会触发一次 你写成选项式,就明白了 export default defineComponent({ setup(){}, mounted(){} }) setup 中只会走一次 mounted 也是
    0 0
  • yezheyu
    2022年9月27日 09:19
    好使,多谢 能稍微解释下吗
    0 0
  • cydysm
    2022年9月27日 09:19
    #8 加 key 属性,每次只要变了都会认为是一个新的组件 而不是复用 在这个基础上的话 我觉得 key 可以改成 symbol
    0 0
  • bebop
    2022年9月27日 10:49
    我觉得最合适的办法是,在 User.vue 中定义一个方法,然后暴露给父组件。父组件每次点击按钮的时候,调用这个方法,把新的数据传递给子组件。
    0 0
  • Zzzz77
    2022年9月27日 13:47
    这就是最基础的父子组件啊,首先 props 的定义是必须的,不理解 OP 为什么会选择用 这种方式来取父组件的值.. 其次`User 组件内部的代码只会执行一次,`console.log` 不会随着 button 的点击事件执行多次`,这是当然的,和响应式无关,不管 name 变不变,console.log 肯定都只会执行一次。如果需要在 name 变化时执行一些副作用,watch 是最正统的方式,#8 的方法不建议...#16 的方法可行,但这明显更倾向 React 的思维
    0 0