美文网首页Vue.js
vue2绑定内联样式background的一些坑

vue2绑定内联样式background的一些坑

作者: 宇cccc | 来源:发表于2017-04-11 12:45 被阅读3526次

    此时我有一个需求,给一个盒子添加一个背景图片,这个背景图片是动态请求回来的,那么应该怎么做?看似简单,其实很考研对JavaScript基础的功底以及对vue生命周期的理解。
    正常情况下的vue内联样式如下写法:

    <div :style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
    data: {
      activeColor: 'red',
      fontSize: 30
    }
    

    此时的style绑定的是一个JavaScript对象,在JavaScript中不允许出现 "-" ,那么绑定一个背景图片应该这么写:

    <div :style="{background: 'url('+ img +')',backgroundSize:cover }"></div>
    data:{
      img:'xxx.png'
    }
    

    好了背景图片已经成功通过字符串拼接的方式加上了,我们改为动态请求回来的。

    <div :style="{background: 'url('+ img +')',backgroundSize:cover }"></div>
    data:{
        img:'xxx.png'
    },
    methods:{
    // 伪代码 请求数据
          getImg(){
            this.$http.get().then(function (e) {
              this.img = e.data //将数据赋值给img
            }.bind(this))
          }
    },
    created(){
    // 调用函数
        this.getImg()
    }
    

    created vue2生命周期钩子函数
    在实例创建之后同步调用。此时实例已经结束解析选项,这意味着已建立:数据绑定data,计算属性computed,方法methods,watcher/事件回调。
    此时你会发现虽然渲染了出来,但是报错了

    Error in render function
    Cannot read property 'img' of undefined
    

    因为在生命周期 mounted 之前都是虚拟dom 也就是说 当页面已经渲染完,但是vue还没执行,所有数据丢失,此时我们加上

    <div v-if='img ' :style="{background: 'url('+ img +')',backgroundSize:cover }"></div>
    

    表示有img属性的时候我们选择这个元素,至此就成功绑定背景图片了。

    相关文章

      网友评论

      • 糖砂西红柿:楼主我有一个小问题,有没有v-if,最终都会渲染完成,那写不写,有什么区别,难道仅仅是因为,取消掉了抱错看着舒服?因为不写 v-if肯定比写v-if要多消耗那么一点点性能
        宇cccc:@糖砂西红柿 过早优化是万恶之源
      • 糖砂西红柿:感谢楼主

      本文标题:vue2绑定内联样式background的一些坑

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