Vue


计算属性 computed

<h3>计算属性 computed</h3> <p>首次在页面上渲染会被调用一次,之后会被缓存:</p> <pre><code class="language-javascript">&amp;lt;template&amp;gt; &amp;lt;input type=&amp;quot;text&amp;quot; v-model=&amp;quot;firstname&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;text&amp;quot; v-model=&amp;quot;lastname&amp;quot;&amp;gt; &amp;lt;p&amp;gt;{{ fullname }}&amp;lt;/p&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; import { ref, computed } from 'vue' let firstname = ref(&amp;quot;Andy&amp;quot;) let lastname = ref(&amp;quot;Zhou&amp;quot;) let fullname = computed(() =&amp;gt; { console.log('computed') return firstname.value + lastname.value }) &amp;lt;/script&amp;gt;</code></pre> <p>由于被缓存,所以虽然页面上渲染了三次,但是 console.log 也只有一次:</p> <pre><code class="language-javascript">&amp;lt;template&amp;gt; &amp;lt;input type=&amp;quot;text&amp;quot; v-model=&amp;quot;firstname&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;text&amp;quot; v-model=&amp;quot;lastname&amp;quot;&amp;gt; &amp;lt;p&amp;gt;{{ fullname }}&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;{{ fullname }}&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;{{ fullname }}&amp;lt;/p&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; import { ref, computed } from 'vue' let firstname = ref(&amp;quot;Andy&amp;quot;) let lastname = ref(&amp;quot;Zhou&amp;quot;) let fullname = computed(() =&amp;gt; { console.log('computed') return firstname.value + lastname.value }) &amp;lt;/script&amp;gt;</code></pre> <p>在其依赖变化时也会再调用:(第一次是渲染,第二次是改变了 firstname) <img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=0c439e5b3517bcd8619071226218a8c0&amp;amp;file=file.png" alt="" /></p> <p>想获取计算属性的值,也得用 .value ,但是是只读的不可以更改 <img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=2c7f5aba2242a0efb3641c29469cbee2&amp;amp;file=file.png" alt="" /></p> <hr /> <p><strong>计算属性和方法的区别:</strong></p> <ul> <li>计算属性:首次在页面上渲染会被调用一次,之后会被缓存,在其依赖变化时才会再调用</li> <li>方法:总会在渲染时被调用</li> </ul> <hr /> <p><strong>应用1:子组件用计算属性监听父组件props值的变化:</strong></p> <pre><code class="language-javascript">父组件:将 name 传给子组件 &amp;lt;template&amp;gt;   &amp;lt;button @click=&amp;quot;change&amp;quot;&amp;gt;click&amp;lt;/button&amp;gt;   &amp;lt;Child :name=&amp;quot;name&amp;quot;&amp;gt;&amp;lt;/Child&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; import { ref } from &amp;quot;vue&amp;quot;; import Child from &amp;quot;@/components/Child.vue&amp;quot;; let name = ref(&amp;quot;Andy&amp;quot;); const change = () =&amp;gt; {   name.value = &amp;quot;aaa&amp;quot;; }; &amp;lt;/script&amp;gt;</code></pre> <pre><code class="language-javascript">子组件:子组件监听 name 的变化 &amp;lt;template&amp;gt;   &amp;lt;div :data=&amp;quot;newname&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; import { inject, watch, computed } from &amp;quot;vue&amp;quot;; const props = defineProps({   name: {     type: String,   }, }); const newname = computed(() =&amp;gt; {   console.log(props.name);   return props.name; }); &amp;lt;/script&amp;gt;</code></pre> <p>刚开始控制台打印 Andy,点击按钮后打印 aaa <img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=faefc0f74926be74fa3a088a61ed8237" alt="" /></p>

页面列表

ITEM_HTML