01-02.Vue的常用指令(二)

news2025/1/10 21:10:21

01-02.Vue的常用指令(二)

  • 前言
    • v-model:双向数据绑定
    • v-model举例:实现简易计算器
    • Vue中通过属性绑定为元素设置class 类样式
      • 引入
      • 方式一:数组
      • 写法二:在数组中使用三元表达式
      • 写法三:在数组中使用 对象 来代替 三元表达式(提高代码的可读性)
    • Vue中通过属性绑定为元素设置 style 行内样式
      • 写法一
      • 写法二
      • 写法三
    • v-for:for循环的四种使用方式
      • 引入
      • 方式一:普通数组的遍历
      • 方式二:对象数组的遍历
      • 方式三:对象的遍历
      • 方式四:遍历数字
      • v-for中key的使用注意事项
    • v-if:设置元素的显示和隐藏(添加/删除DOM元素)
    • v-show:设置元素的显示和隐藏(在元素上添加/移除`style="display:none"`属性)
      • v-if和v-show的区别

前言

我们接着上一篇文章 01-01.Vue的插值表达式和常用指令(一) 来讲。


下一篇文章 01-03.Vue:v-on的事件修饰符

本文主要内容:

  • v-model

  • v-for

  • v-if

  • v-show

    v-model:双向数据绑定

重点:双向数据绑定,只能用于表单元素,或者用于自定义组件

之前的文章里,我们通过v-bind,给<input>标签绑定了data对象里的name属性。当data里的name的值发生改变时,<input>标签里的内容会自动更新。

可我现在要做的是:我在<input>标签里修改内容,要求data里的name的值自动更新。从而实现双向数据绑定。该怎么做呢?这就可以利用v-model这个属性。

区别

  • v-bind:只能实现数据的单向绑定,从 M 自动绑定到 V。

  • v-model:只有v-model才能实现双向数据绑定。注意,v-model 后面不需要跟冒号,

注意:v-model 只能运用在表单元素中,或者用于自定义组件。常见的表单元素包括:input(radio, text, address, email…) 、select、checkbox 、textarea。

代码举例如下:

<template>
  <div>
    <!-- 将 input 标签中的value值双向绑定到 Vue实例中的data。注意,v-model 后面不需要跟冒号 -->
    <input type="text" id="username" v-model="myAccount.username" />
    <input type="password" id="pwd" v-model="myAccount.userpwd" />
    <input type="submit" v-on:click="submit1" value="注册" />
  </div>
</template>

<script>
export default {
  name: "HomeView",
  data() {
    return {
      name: "HydeLinjr",
      myAccount: {
        username: "",
        userpwd: "",
      },
    };
  },
  //在methods里绑定各种方法,根据业务需要进行操作
  methods: {
    submit1(){
      alert(this.myAccount.username + "  pwd=" + this.myAccount.userpwd);
    },
  },
};
</script>

此时,便可实现我们刚刚要求的双向数据绑定的效果。

v-model举例:实现简易计算器

题目:现在两个输入框,用来做加减乘除,将运算的结果放在第三个输入框。

实现代码如下:

  <template>
    <div>
      <input type="text" v-model="n1" />
      <select v-model="opt">
        <option value="+">+</option>
        <option value="-">-</option>
        <option value="*">*</option>
        <option value="/">/</option>
      </select>
      <input type="text" v-model="n2" />
      <input type="button" value="=" @click="calc" />
      <input type="text" v-model="result" />
    </div>
  </template>

  <script>
  export default {
    name: "HomeView",
    data() {
      return {
        n1: 0,
        n2: 0,
        result: 0,
        opt: "+",
      };
    },
    //在methods里绑定各种方法,根据业务需要进行操作
    methods: {
      calc() {
        // 计算器算数的方法
        // 逻辑判断:
        switch (this.opt) {
          case "+":
            this.result = parseInt(this.n1) + parseInt(this.n2);
            break;
          case "-":
            this.result = parseInt(this.n1) - parseInt(this.n2);
            break;
          case "*":
            this.result = parseInt(this.n1) * parseInt(this.n2);
            break;
          case "/":
            this.result = parseInt(this.n1) / parseInt(this.n2);
            break;
        }

        //上面的逻辑判断,可能有点啰嗦,我们还可以采取下面的这种方式进行逻辑判断
        // 注意:这是投机取巧的方式,正式开发中,尽量少用
        // var codeStr = 'parseInt(this.n1) ' + this.opt + ' parseInt(this.n2)'
        // this.result = eval(codeStr)
      },
    },
  };
  </script>

注意上方代码中的注释,可以了解下eval()的用法。

Vue中通过属性绑定为元素设置class 类样式

注意,是类样式

引入

我们先来看下面这段代码:

<template>
  <!--这个div区域就是MVVM中的 View-->
  <div id="div1">
    <h1 class="my-red my-thin">我是海德小林,HydeLinjr</h1>
  </div>
</template>

<script>
export default {
};
</script>
<style>
.my-red {
  color: red;
}

.my-thin {
  /* 设置字体的粗细 */
  font-weight: 200;
}

.my-italic {
  font-style: italic;
}

.my-active {
  /* 设置字符之间的间距 */
  letter-spacing: 0.5em;
}
</style>

上面的代码中,我们直接通过正常的方式,给<h1>标签设置了两个 class 类的样式。代码抽取如下:

    <h1 class="my-red my-thin">我是海德小林,HydeLinjr</h1>

上面的效果,我们还可以用Vue来写。这就引入了本段要讲的方式。

方式一:数组

方式一:直接传递一个数组。注意:这里的 class 需要使用 v-bind 做数据绑定。

代码如下:

<template>
  <!--这个div区域就是MVVM中的 View-->
  <div id="div1">
    <h1 class="my-red my-thin">我是海德小林,HydeLinjr</h1>
    <!-- vue的写法1:数组的形式 -->
    <h1 :class="['my-red', 'my-thin']">我是海德小林,HydeLinjr</h1>
  </div>
</template>

<script>
export default {};
</script>
<style>
.my-red {
  color: red;
}

.my-thin {
  /* 设置字体的粗细 */
  font-weight: 200;
}

.my-italic {
  font-style: italic;
}

.my-active {
  /* 设置字符之间的间距 */
  letter-spacing: 0.5em;
}
</style>

代码抽取如下:

        <!-- vue的写法1:数组的形式 -->
<h1 :class="['my-red', 'my-thin']">我是海德小林,HydeLinjr</h1>

上方代码中,注意,数组里写的是字符串;如果不加单引号,就不是字符串了,而是变量。

演示效果如下:

14

写法二:在数组中使用三元表达式

<template>
  <div>
    <!-- vue的写法2:在数组中使用三元表达式。注意格式不要写错-->
    <!-- 通过data中布尔值 flag 来判断:如果 flag 为 true,就给 h1 标签添加`my-active`样式;否则,就不设置样式。 -->
    <h1 :class="[flag ? 'my-active' : '']">我是海德小林,HydeLinjr</h1>
  </div>
</template>

<script>
export default {
  name: "HomeView",
  data() {
    return {
      flag: true,
    };
  },
};
</script>

上方代码的意思是,通过data中布尔值 flag 来判断:如果 flag 为 true,就给 h1 标签添加my-active样式;否则,就不设置样式。

注意,三元表达式的格式不要写错了。

写法三:在数组中使用 对象 来代替 三元表达式(提高代码的可读性)

上面的写法二,可读性较差。于是有了写法三。

写法三:在数组中使用对象来代替三元表达式

代码如下:

<template>
  <div>
    <!-- vue的写法3:在数组中使用对象来代替三元表达式。-->
    <h1 :class="[ {'my-active':flag} ]">我是海德小林,HydeLinjr</h1>
  </div>
</template>

<script>
export default {
  name: "HomeView",
  data() {
    return {
      flag: true,
    };
  },
};
</script>

Vue中通过属性绑定为元素设置 style 行内样式

注意,是行内样式(即内联样式)。

写法一

写法一:直接在元素上通过 :style 的形式,书写样式对象。

例如:

        <h1 :style="{color: 'red', 'font-size': '20px'}">我是海德小林,HydeLinjr</h1>

写法二

写法二:将样式对象,定义到 data 中,并直接引用到 :style 中。

也就是说,把写法一的代码改进一下。代码如下:

<template>
  <div>
    <h1 :style="styleObj">我是海德小林,HydeLinjr</h1>
  </div>
</template>

<script>
export default {
  name: "HomeView",
  data() {
    return {
      styleObj: { color: 'red', 'font-size': '20px' }
    };
  },
};
</script>

写法三

写法二只用到了一组样式。如果想定义多组样式,可以用写法三。

写法三:在 :style 中通过数组,引用多个 data 上的样式对象。

代码如下:

<template>
  <div>
    <h1 :style="[styleObj1, styleObj2]">我是海德小林,HydeLinjr</h1>
  </div>
</template>

<script>
export default {
  name: "HomeView",
  data() {
    return {
      styleObj1: { color: "red", "font-size": "20px" },
      styleObj2: { "font-style": "italic" },
    };
  },
};
</script>

v-for:for循环的四种使用方式

作用:根据数组中的元素遍历指定模板内容生成内容。

引入

比如说,如果我想给一个ul中的多个li分别赋值1、2、3…。如果不用循环,就要挨个赋值:

<template>
  <div>
    <ul>
      <li>{{list[0]}}</li>
      <li>{{list[1]}}</li>
      <li>{{list[2]}}</li>
    </ul>
  </div>
</template>

<script>
export default {
  name: "HomeView",
  data() {
    return {
      list: [1, 2, 3]
    };
  },
};
</script>


效果:

为了实现上面的效果,如果我用v-for进行赋值,代码就简洁很多了:

<template>
  <div>
    <ul>
      <!-- 使用v-for对多个li进行遍历赋值 -->
      <li v-for="item in list" :key="item">{{ item }}</li>
    </ul>
  </div>
</template>

<script>
export default {
  name: "HomeView",
  data() {
    return {
      list: [1, 2, 3],
    };
  },
};
</script>


接下来,我们详细讲一下v-for的用法。需要声明的是,Vue 1.0的写法和Vue 2.0的写法是不一样的。本文全部采用Vue 2.0的写法。

方式一:普通数组的遍历

针对下面这样的数组:

<script>
  new Vue({
    el: '#app',
    data: {
      arr1: [2, 5, 3, 1, 1],
    }
  });
</script>

将数组中的赋给li:

      <li v-for="item in arr1" :key="item">{{item}}</li>

将数组中的值和index赋给li:

      <!-- 括号里如果写两个参数:第一个参数代表值,第二个参数代表index 索引 -->
      <li v-for="(item,index) in arr1" :key="index">值:{{item}} --- 索引:{{index}}</li>

效果如下:

方式二:对象数组的遍历

<template>
 <div>
   <ul>
     <!-- 对象数组的遍历。括号里如果写两个参数:第一个参数代表数组的单个item,第二个参数代表 index 索引-->
     <li v-for="(item, index) in dataList" :key="index">
       姓名:{{ item.name }} --- 年龄:{{ item.age }} --- 索引:{{ index }}
     </li>
   </ul>
 </div>
</template>

<script>
export default {
 name: "HomeView",
 data() {
   return {
     //对象数组
     dataList: [
       { name: "zhangsan", age: "26" },
       { name: "lisi", age: "32" },
       { name: "wangwu", age: "20" },
     ],
   };
 },
};
</script>

效果如下:

方式三:对象的遍历

针对下面这样的对象:

<script>
export default {
  name: "HomeView",
  data() {
    return {
      obj1: {
        name: "hydelinjr",
        age: "26",
        gender: "男",
      },
    };
  },
};
</script>

将上面的obj1对象的数据赋值给li,写法如下:

<template>
 <div>
   <ul>
     <!-- 括号里如果写两个参数:则第一个参数代表value,第二个参数代表key -->
     <li v-for="(value,key) in obj1" :key="key">值:{{value}} --- 键:{{key}} </li>

     <h3>---分隔线---</h3>

     <!-- 括号里如果写三个参数:则第一个参数代表value,第二个参数代表key,第三个参数代表index -->
     <li v-for="(value,key,index) in obj1" :key="index">值:{{value}} --- 键:{{key}} --- index:{{index}} </li>
   </ul>
 </div>
</template>

效果如下:

方式四:遍历数字

in后面还可以直接放数字。举例如下:

        <ul>
            <!-- 对象数组的遍历 -->
            <!-- 注意:如果使用 v-for 遍历数字的话,前面的 myCount 值从 1 开始算起 -->
            <li v-for="myCount in 10">这是第 {{myCount}}次循环</li>
        </ul>

效果如下:

v-for中key的使用注意事项

注意:在 Vue 2.2.0+ 版本里,当在组件中使用 v-for 时,key 属性是必须要加上的。

这样做是因为:每次 for 循环的时候,通过指定 key 来标示当前循环这一项的唯一身份

当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用 “就地复用” 策略。如果数据项的顺序被改变,Vue将不是移动 DOM 元素来匹配数据项的顺序, 而是简单复用此处每个元素,并且确保它在特定索引下显示已被渲染过的每个元素。

为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key 属性。

key的类型只能是:string/number,而且要通过 v-bind 来指定。

代码举例:

<template>
  <div>
    <div>
      <label
        >Id:
        <input type="text" v-model="id" />
      </label>

      <label
        >Name:
        <input type="text" v-model="name" />
      </label>

      <input type="button" value="添加" @click="add" />
    </div>

    <!-- 注意: v-for 循环的时候,key 属性只能使用 number 或者 string -->
    <!-- 注意: key 在使用的时候,必须使用 v-bind 属性绑定的形式,指定 key 的值 -->
    <!-- 在组件中,使用v-for循环的时候,或者在一些特殊情况中,如果 v-for 有问题,必须 在使用 v-for 的同时,指定 唯一的 字符串/数字 类型 :key 值 -->
    <p v-for="item in list" :key="item.id">
      <input type="checkbox" />{{ item.id }} --- {{ item.name }}
    </p>
  </div>
</template>

<script>
export default {
  name: "HomeView",
  data() {
    return {
      id: "",
      name: "",
      list: [
        { id: 1, name: "hyde" },
        { id: 2, name: "lin" },
        { id: 3, name: "hydelinjr" },
        { id: 4, name: "Hydelinjr" },
        { id: 5, name: "HydeLinjr" },
      ],
    };
  },
  methods: {
    add() {
      // 添加方法
      this.list.unshift({ id: this.id, name: this.name });
    },
  },
};
</script>


v-if:设置元素的显示和隐藏(添加/删除DOM元素)

作用:根据表达式的值的真假条件,来决定是否渲染元素,如果为false则不渲染(达到隐藏元素的目的),如果为true则渲染。

在切换时,元素和它的数据绑定会被销毁并重建。

举例如下:(点击按钮时,切换和隐藏盒子)

<template>
  <div>
    <button v-on:click="toggle">显示/隐藏</button>
    <div v-if="isShow">我是盒子</div>
  </div>
</template>

<script>
export default {
  name: "HomeView",
  data() {
    return {
      isShow: true,
    };
  },
  methods: {
    toggle: function () {
      this.isShow = !this.isShow;
    },
  },
};
</script>


效果如下:

v-show:设置元素的显示和隐藏(在元素上添加/移除style="display:none"属性)

作用:根据表达式的真假条件,来切换元素的 display 属性。如果为false,则在元素上添加 display:none属性;否则移除display:none属性。

举例如下:(点击按钮时,切换和隐藏盒子)

我们直接把上一段代码中的v-if改成v-show就可以了:

<template>
  <div>
    <button v-on:click="toggle">显示/隐藏</button>
    <div v-show="isShow">我是盒子</div>
  </div>
</template>

<script>
export default {
  name: "HomeView",
  data() {
    return {
      isShow: true,
    };
  },
  methods: {
    toggle: function () {
      this.isShow = !this.isShow;
    },
  },
};
</script>


效果如下:

v-if和v-show的区别

v-ifv-show都能够实现对一个元素的隐藏和显示操作。

区别:

  • v-if:每次都会重新添加/删除DOM元素,元素和它的数据绑定会被销毁并重建。

  • v-show:每次不会重新进行DOM的添加/删除操作,只是在这个元素上添加/移除style="display:none"属性,表示节点的显示和隐藏。

优缺点:

  • v-if:有较高的切换性能消耗。这个很好理解,毕竟每次都要进行dom的添加/删除操作。

  • v-show:有较高的初始渲染消耗。也就是说,即使一开始v-show="false",该节点也会被创建,只是隐藏起来了。而v-if="false"的节点,根本就不会被创建。

总结

  • 如果元素涉及到频繁的切换,最好不要使用 v-if, 而是推荐使用 v-show

  • 如果元素可能永远也不会被显示出来被用户看到,则推荐使用 v-if

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1692956.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOv10尝鲜测试五分钟极简配置

最近清华大学团队又推出YOLOv10&#xff0c;真是好家伙了。 安装&#xff1a; pip install supervision githttps://github.com/THU-MIG/yolov10.git下载权重&#xff1a;https://github.com/THU-MIG/yolov10/releases/download/v1.0/yolov10n.pt 预测&#xff1a; from ult…

2024年最全的信息安全、数据安全、网络安全标准分享(可下载)

以上是资料简介和目录&#xff0c;如需下载&#xff0c;请前往星球获取&#xff1a;https://t.zsxq.com/Gz1a0

基于SpringBoot+Vue的人事管理系统

引言 目前,人事管理的系统大都是CS架构的大型系统,很少有面向机关,事业单位内部的基于BS架构的微型人事系统,因此.开发一个基于BS架构的人事信息管理系统是非常必要的.但是基于BS架构的人事系统对于安全是一个大的考验点.在人事信息系统中,功能需简单清晰,可操作性强,其次安全…

结构化开发方法(数据流图)

一、系统设计基本原理 二、系统总体结构设计 三、数据流图 数据流图

数据库(4)——DDL数据库操作

SQL标准没有提供修改数据库模式定义的语句&#xff0c;用户想修改次对象只能将它删除后重建。 查询 查询所有数据库&#xff1a; SHOW DATABASES; 在安装完MySQL数据库之后&#xff0c;自带了4个数据库&#xff0c;如下图&#xff1a; 创建数据库 数据库的创建语言为 CREATE…

web学习笔记(五十六)

目录 1.绑定类名和style 1.1 绑定类名 1.1.1 绑定单个类名 1.1.2 绑定多个类名 1.2 style相关知识 2. vue的响应式原理 3. v-once 4.本地搭建Vue单页应用 4.1 安装Vue脚手架 4.2 安装对应的包文件 4.3 运行项目 1.绑定类名和style 1.1 绑定类名 1.1.1 绑定单个类名…

浅析FAT32文件系统

本文通过实验测试了FAT文件系统的存储规律&#xff0c;并且探究了部分可能的文件隐藏方法。 实验背景 现有一块硬盘&#xff08;U盘&#xff09;&#xff0c;其中存在两个分区&#xff0c;分别为FAT32和NTFS文件系统分区。 在FAT分区中存在如下文件&#xff1a; 现需要阅读底…

智研未来,直击 AI DevOps,阿里云用户交流日杭州站来啦!

在这个技术日新月异的时代&#xff0c;云上智能化 DevOps 正以前所未有的速度推动企业创新边界&#xff0c;重塑软件开发的效率与品质。 为深入探索这一变革之路&#xff0c;诚邀您参与我们的专属闭门技术沙龙&#xff0c;携手开启一场关于云上智能化 DevOps 的挑战、实践与未…

【全网最全】2024电工杯数学建模B题完整版保奖思路代码模型(后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片链接&#xff0c;那是您获取资料的入口&#xff01; 【全网最全】2024电工杯数学建模B题53页成品论文完整matlab、py代码19建模过程代码数据等&#xff08;后续会更新&#xff09;「首先来看看目前已有的…

Modular RPG Hero PBR

-掩码着色着色器提供了无限的颜色变化。(适用于标准/HDRP/URP 11.0.0) -为剑与盾/双剑/双剑姿态提供了简单的角色控制器。(不包括弓和魔杖控制器)(它是用旧的输入系统建造的) -HDRP/URP(11.0.0)SRP 100%支持常规着色器和遮罩着色着色器(基于着色器图形) -具有许多模块…

光源亮度检测应用笔记

光源亮度检测应用笔记 光电检测应用光电二极管等效模型和基本参数连接并联电阻&#xff08;RJ&#xff09;串联电阻&#xff08;RS&#xff09;结电容&#xff08;CJ&#xff09;暗电流&#xff08;ID&#xff09; 光电二极管电流-电压转换器无源光电二极管电流-电压转换器有源…

Java进阶学习笔记11——多态

什么是多态&#xff1f; 多态是在继承/实现情况下一种现象&#xff0c;表现为&#xff1a;对象多态和行为多态。 同一个对象&#xff0c;在不同时刻表现出来的不同形态。 多态的前提&#xff1a; 要有继承/实现关系 要有方法的重写 要有父类引用指向子类对象。 多态的具体代码…

Linux 内核之 mmap 内存映射的原理及源码解析

文章目录 前言一、简介1. mmap 是什么&#xff1f;2. Linux 进程虚拟内存空间 二、mmap 内存映射1. mmap 内存映射的实现过程2. mmap 内存映射流程2.1 mmap 系统调用函数2.2 ksys_mmap_pgoff 函数2.3 vm_mmap_pgoff 函数2.4 do_mmap_pgoff 函数2.5 do_mmap 函数2.6 get_unmappe…

智能化让幼儿园管理更加规范

在各个学龄阶段&#xff0c;幼儿园一向都是家长的教师最为操心的&#xff0c;一方面幼儿园孩子自主才能差&#xff0c;安全问题需求分外注重&#xff0c;另一方面&#xff0c;幼儿园孩子年纪小、缺少必定的认知才能和区分才能&#xff0c;需求加强引导。 那么怎么进步幼儿园孩子…

【vue/ucharts】ucharts 自定义格式化 y 轴数据显示(横向柱状图常用)

使用 ucharts 的柱状图时&#xff0c;尤其是横向柱状图会更常见&#xff0c;会有自定义 y 轴数据的情况&#xff0c;就像使用过滤器时对数据进行格式化以达到自己想要的效果一样&#xff1b; 比如我想要这样的效果&#xff1a; 官网里的栗子如图所示&#xff1a; 但是如果此…

探索消费新纪元:引领消费增值的潮流

亲爱的朋友们&#xff0c; 大家好&#xff01;今天我想和大家分享一种全新的消费观念——消费增值&#xff0c;这是一种让消费变得更有意义和价值的创新方式。 在传统的消费模式中&#xff0c;我们购买商品或服务&#xff0c;满足需求后便结束了整个消费过程。但如今&#xff…

1.Redis之初识Redis分布式系统

1.初识Redis 1.1 官网 Redis中文网 Redis 教程 | 菜鸟教程 (runoob.com) 1.2 解释 在内存中存储数据 定义变量,不就是在内存中存储数据嘛?? Redis 是在分布式系统&#xff08;进程的隔离性&#xff1a;Redis 就是基于网络&#xff0c;可以把自己内存中的变量给别的进程…

DA-CLIP论文阅读笔记

这是ICLR2024的一篇用VLM做multi-task image restoration的论文首页图看起来就很猛啊&#xff0c;一个unified模型搞定10个任务&#xff1a; 文章的贡献点主要是两个&#xff0c;一个是提出一个利用Image Controller&#xff0c;CLIP&#xff0c;cross-attention 和 diffusion …

外卖系统源码开发全攻略:外卖小程序与后台管理系统的设计与实现

今天&#xff0c;小编将详细介绍外卖系统源码的开发全攻略&#xff0c;从需求分析到设计与实现&#xff0c;为开发者提供全面指导。 一、需求分析 1.用户需求 用户是外卖系统的核心&#xff0c;需满足以下基本需求&#xff1a; -浏览菜单并下单 -实时追踪订单 -多种支付方…

3D虚拟艺术品网上展让观众沉浸式感受到艺术的魅力和力量

传统的艺术品展厅因为空间有限、内容割裂、形式静态和局限性强导致传播和宣传效果难以保障&#xff0c;艺术品VR线上虚拟艺术品展示借助web3d开发建模和VR虚拟现实技术&#xff0c;打造数字化、互动化、信息化的展示&#xff0c;不仅是一场视觉的革命&#xff0c;更是对传统展览…