资讯专栏INFORMATION COLUMN

原生渲染指令

HitenDev / 3160人阅读

摘要:代码原生渲染有时数据中携带了标签,输出它们时,按文本解析,如使用输出原生的使用原生指令解析数据中标签为原生你的站点上动态渲染的任意可能会非常危险,因为它很容易导致攻击。

代码

原生html渲染v-html

有时数据中携带了Html标签,输出它们时,按文本解析,如:

new Vue({
    data: {
        title:"

使用v-html输出原生的html

", } }).$mount("#app-1")
{{title}}

使用原生指令v-html解析数据中标签为原生html

你的站点上动态渲染的任意 HTML 可能会非常危险,因为它很容易导致 XSS 攻击。请只对可信内容使用 HTML 插值,绝不要对用户提供的内容使用插值。

如:

new Vue({
    data: {
        title:"

使用v-html输出原生的html

", recieveMessage:"", } }).$mount("#app-1")

使用时要注意这种情况。插入

Vue.set

以下两种情形的数据变化,vue无法再视图中作出响应

当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue
当你修改数组的长度时,例如:vm.items.length = newLength

如添加以下代码,点击按钮修改

modifyItem(){
    this.boxOffice[0] = { name: "The Last Jedi", year: 201
![clipboard.png](/img/bV8201)
7, sells: "13.32", director: { firstname: "yannie", lastname: "cheung", age: "17" } }
    this.boxOffice.length = 5
}

没有任何响应,但事实上值已经更新,

不过设置某索引对应对象的属性,时会有响应的

modifyItem(){
    //无响应
    this.boxOffice[0] = { name: "The Last Jedi", year: 2017, sells: "13.32", director: { firstname: "yannie", lastname: "cheung", age: "17" } }
    this.boxOffice.length = 5
    //有响应
    this.boxOffice[1].name = "somename"
}

索引值和长度的改变是因为其他改变(this.boxOffice[1].name = "somename")触发了响应,而并非他们自身是响应式的。

为了解决这个问题提供了两种:使用变异方法splice()Vue.set

//设置
modifyItem(){
    //无响应
    // this.boxOffice[0] = { name: "The Last Jedi", year: 2017, sells: "13.32", director: { firstname: "yannie", lastname: "cheung", age: "17" } }
    // this.boxOffice.length = 5
    
    //无响应的解决方法
    // this.$set 等价于 Vue.set
    Vue.set(this.boxOffice, 0, { name: "The Last Jedi", year: 2017, sells: "13.32", director: { firstname: "yannie", lastname: "cheung", age: "17" }})
    // this.boxOffice.splice(0, 1, { name: "The Last Jedi", year: 2017, sells: "13.32", director: { firstname: "yannie", lastname: "cheung", age: "17" }})
    //修改长度
    this.boxOffice.splice(5)
    
    //有响应
    // this.boxOffice[1].name = "somename"
}

此时,点击按钮设置新状态,立刻作出响应。

对于对象而言,属性的添加或删除无法响应,如

//添加对象属性
modifyObject(){
    this.boxOffice[0].director.sex = "male"
}

可以使用Vue.set解决这个问题

或者将对象原先属性和新增属性合并成新对象再赋给该对象,这使我们可以添加多个属性,如:

//methods
//添加对象属性
modifyObject(){
    // 无响应
    // this.boxOffice[0].director.sex = "male"
    //解决方法
    Vue.set(this.boxOffice[0].director, "sex", "male")
    
    this.boxOffice[0].director = Object.assign({}, this.boxOffice[0].director,{
        aliasname:"kanzaki urumi",
        graduation: "NUIST"
    })
}

template

同 v-if,包裹多个元素,下节有使用到。

v-if、v-for优先级

v-for 的优先级比 v-if 高。就是说可以向下面这样,先展开所有列表项,之后 v-if 将作用于每个列表项。

为影片添加是否上映属性run

boxOffice: [
    { name: "Avatar", year: 2009, sells: "27.88",run:true, director: { firstname: "yannie", lastname: "cheung", age: "17" } },
    { name: "Frozen", year: 2013, sells: "12.765",run:false },
    { name: "Furious 7", year: 2015, sells: "15.15",run:true },
    { name: "Iron Man 3", year: 2013, sells: "12.154",run:false },
    { name: "Titanic", year: 1997, sells: "21.868",run:false },
    { name: "Spectre", year: 2015, sells: "8.722",run:true },
    { name: "Inception", year: 2010, sells: "8.255",run:false },
    { name: "Jurassic World", year: 2015, sells: "16.99",run:false }
]

v-for|if 的优先级

  • {{bo.name}} {{bo.year}} ({{bo.sells}}$ )
v>

如果想设置在某条件下循环是否执行,那么可以在外层加上 v-if

v-for|if 的优先级

  • 没有影片
组件上的v-for

和在原生元素上使用一样,只是必须使用 key

new Vue({
    data: {
        boxOffice: [
            { id:1,name: "Avatar", year: 2009, sells: "27.88", run: true, director: { firstname: "yannie", lastname: "cheung", age: "17" } },
            { id:2,name: "Frozen", year: 2013, sells: "12.765", run: false },
            { id:3,name: "Furious 7", year: 2015, sells: "15.15", run: true },
            { id:4,name: "Iron Man 3", year: 2013, sells: "12.154", run: false },
            { id:5,name: "Titanic", year: 1997, sells: "21.868", run: false },
            { id:6,name: "Spectre", year: 2015, sells: "8.722", run: true },
            { id:7,name: "Inception", year: 2010, sells: "8.255", run: false },
            { id:8,name: "Jurassic World", year: 2015, sells: "16.99", run: false }
        ]
    },
    components: {
        "child": {
            props:["bo"],
            template: "
  • {{bo.id}}、{{bo.name}}
  • " } } }).$mount("#app-5")

    更多内容参见组件与单文件组件部分

    文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

    转载请注明本文地址:https://www.ucloud.cn/yun/94463.html

    相关文章

    • 用WEB技术栈开发NATIVE应用(二):WEEX 前端SDK原理详解

      摘要:依旧采取传统的开发技术栈进行开发,同时在终端的运行体验不输。首先来看下前端开发框架目前与构成了三大最流行的前端开发框架,具有组件化以及三大特性,还学习的,引入了状态管理模块。 摘要: WEEX依旧采取传统的web开发技术栈进行开发,同时app在终端的运行体验不输native app。其同时解决了开发效率、发版速度以及用户体验三个核心问题。那么WEEX是如何实现的?目前WEEX已经完全开...

      ls0609 评论0 收藏0
    • 用WEB技术栈开发NATIVE应用:WEEX SDK原理详解

      摘要:于是后来业界开始探索依旧利用技术栈开发出媲美原生体验的方案,于是以为代表云原生开发框架开始出现。依旧采取传统的开发技术栈进行开发,同时在终端的运行体验不输。其同时解决了开发效率发版速度以及用户体验三个核心问题。 摘要: WEEX依旧采取传统的web开发技术栈进行开发,同时app在终端的运行体验不输native app。其同时解决了开发效率、发版速度以及用户体验三个核心问题。那么WEEX...

      nanfeiyan 评论0 收藏0

    发表评论

    0条评论

    HitenDev

    |高级讲师

    TA的文章

    阅读更多
    最新活动
    阅读需要支付1元查看
    <