折叠面板案例

219 阅读2分钟

折叠面板

目标 点击展开或收起时,把内容区域显示或隐藏

  • 1 给按钮添加点击事件 @click="ishow = !ishow">
  • 2 给内容添加显示或隐藏的类名 v-show="ishow "
  • 3 给予参数data: ishow为flase flase隐藏 ture显示 拓展: v-show指令是根据条件显示DOM元素的指令,可以用来 动态控制DOM元素的显示和隐藏,v-show后跟的是判断 条件,不管初始条件是什么,元素总是会被渲染 语法:

v-show="判断语法"

1 原理

当v-show值为false时,绑定DOM的dispaly:none 当v-show值为false时, 绑定DOM的dispaly为true时,绑定DOM会移除 display:none, 此时并不是把 display变成block, 而是保持元素 style的原始性,也就是说,不管初始条件 是什么,元素总是会被渲染

2 实现

从实现效果可以看出DOM元素始终是存在的,v-show只是利用元素的display属性 控制着元素的显示隐藏

v-if指令

1 原理

看到v-if,我们可以想刀if...else条件判断语句,没错,Vue中还提供了v-else 指令和v-else-if指令,学会v-if指令其他两个指令也就会了。

这样我们再来理解v-if指令,就是根据表达式值的真假来销毁或重建一个我们绑定 的DOM元素。

2实现

从实现效果可以看出flag值为flase时DOM元素被删除

v-show和v-if指令的区别 既然v-show和v-if这两个指令都可以控制DOM元素的行为,那么它们有什么区别呢

1 控制手段不同

我们从上面两个实现图可以看出,通过浏览器控制改变表达式真值时,虽然页面 效果都一样,但是DOM元素隐藏时大不相同: v-show指令设置隐藏是给绑定的DOM元素添加CSS样式:display:none,但是DOM元素 仍然存在

v-if指令设置隐藏是将DOM元素整个删除,此时DOM元素不再存在

2编译过程不同

v-if切换有一个局部编译/卸载的过程,切换过程中合适地销毁和重建内部的事件监听 和子组件;而v-show只是简单的基于CSS切换,不管初识条件是什么,元素总是会被渲染

3 编译条件不同

v-show由false变为true时不会触发组建的生命周期 v-if由false变为true时,触发租金贷beforeCreate,create,beforeMount, mounter钩子,由true变为flas

代码如下:

<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
  <style>
    body {
      background-color: #ccc;
    }
    #app {
      width: 400px;
      margin: 20px auto;
      background-color: #fff;
      border: 4px solid blueviolet;
      border-radius: 1em;
      box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.5);
      padding: 1em 2em 2em;
    }
    h3 {
        text-align: center;
      }
    .title {
      display: flex;
      justify-content: space-between;
      align-items: center;
      border: 1px solid #ccc;
      padding: 0 1em;
    }
    .title h4 {
      line-height: 2;
      margin: 0;
    }
    .container {
      border: 1px solid #ccc;
      padding: 0 1em;
    }
    .btn {
      /* 鼠标改成手的形状 */
      cursor: pointer;
    }
  </style>
</head>
<body>
  <div id="app">
    <h3>案例:折叠面板</h3>
    <div>
      <div class="title">
        <h4>芙蓉楼送辛渐</h4>
        <span class="btn"  @click="isShow = !isShow" >
          <!-- 添加点击事件 判断是否点击,点击收起内容,在次点击放下 -->
          {{ isShow ? '收起' : '展开' }}
        </span>
      </div>
      <div class="container" v-show="isShow">
        <!-- 判断是否点击 v-show 显示与隐藏 -->
        <p>寒雨连江夜入吴,</p>
        <p>平明送客楚山孤。</p>
        <p>洛阳亲友如相问,</p>
        <p>一片冰心在玉壶。</p>
      </div>
    </div>
  </div>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        isShow:false
      }
    })
  </script>
</body>
</html>