美文网首页vue2 世界
057_末晨曦Vue技术_处理边界情况之强制更新($forceU

057_末晨曦Vue技术_处理边界情况之强制更新($forceU

作者: 前端末晨曦吖 | 来源:发表于2022-08-19 09:06 被阅读0次

    强制更新($forceUpdate)

    点击打开视频讲解更加详细

    在vue中,如果data中有基本数据类型变量:age,修改他,页面会自动更新。
    但如果data中的变量为数组或对象(引用数据类型),我们直接去给某个对象或数组添加属性,页面是识别不到的,不会同步更新;

    <template>
      <div id="app">
        name:<p>{{userInfo.name}}</p>
        age:<p>{{userInfo.age}}</p>
        <button @click="updateName">增加age属性</button>
      </div>
    </template>
    
    <script>
    export default {
      name: 'App',
      data(){
        return {
          userInfo:{
            name:'末晨曦吖'
          }
        } 
      },
      mounted() {
        
      },
      components:{
        
      },
      methods:{
        updateName(){
          this.userInfo.age = 18
        }
      }
    }
    </script>
    
    <style scoped>
     
    </style>
    

    我们尝试给userInfo对象添加属性值,发现页面其实并没有变化

    <template>
      <div id="app">
        name:<p>{{userInfo.name}}</p>
        age:<p>{{userInfo.age}}</p>
    
        <div v-for="(item,index) in list" :key="index">{{ item.name }} --- {{ item.age }}</div>
    
        <button @click="updateName">增加age属性</button>
      </div>
    </template>
    
    <script>
    export default {
      name: 'App',
      data(){
        return {
          userInfo:{
            name:'末晨曦吖'
          },
          list:[
            { name:'末' }
          ]
        } 
      },
      mounted() {
        
      },
      components:{
        
      },
      methods:{
        updateName(){
          // 对象
          // this.userInfo.age = 18
          // this.$forceUpdate()     // 第一种解决方式: this.$forceUpdate(); 强制刷新  同等效果的:window.location.reload()  不推荐
          // this.$set(this.userInfo,'age',18)   // 第二种解决方式 推荐使用
    
          // 数组
          // this.list[0].age = 18 
          // this.$forceUpdate() 
          // this.$set(this.list[0],'age',18)
        }
      }
    }
    </script>
    
    <style scoped>
     
    </style>
    

    通过 v-once 创建低开销的静态组件

    渲染普通的 HTML 元素在 Vue 中是非常快速的,但有的时候你可能有一个组件,这个组件包含了大量静态内容。在这种情况下,你可以在根元素上添加 v-once attribute 以确保这些内容只计算一次然后缓存起来,就像这样:

    Vue.component('terms-of-service', {
      template: `
        <div v-once>
          <h1>Terms of Service</h1>
          ... a lot of static content ...
        </div>
      `
    })
    

    相关文章

      网友评论

        本文标题:057_末晨曦Vue技术_处理边界情况之强制更新($forceU

        本文链接:https://www.haomeiwen.com/subject/jnnygrtx.html