vue 自定義指令封裝一個(gè)手風(fēng)琴嵌套組件

很多教程的手風(fēng)琴組件都是一個(gè)v-for數(shù)組來實(shí)現(xiàn)手風(fēng)琴組件,v-for封裝起來很簡(jiǎn)單毡们,但是我認(rèn)為并不好婉支。
理由如下:

  • 這種方式很不優(yōu)雅
  • 其實(shí)我沒用過這種實(shí)現(xiàn)方式的手風(fēng)琴稽穆,不知道到底怎么實(shí)現(xiàn)配合router來實(shí)現(xiàn)展開和激活?感覺v-for這種實(shí)現(xiàn)手風(fēng)琴的方式實(shí)現(xiàn)這個(gè)功能不太容易米丘。
  • 無法靈活嵌套

所以自己用自定義指令實(shí)現(xiàn)了一個(gè)手風(fēng)琴組件鳞疲。

代碼很長(zhǎng),不想學(xué)習(xí)的可以直接github下載代碼run serve直接使用蠕蚜。

  • 先看效果:

效果圖
  • 支持初始化撐開多個(gè)折疊版,點(diǎn)擊任意一個(gè)之后會(huì)將其他撐開的都關(guān)閉尚洽。
  • 初始撐開為props 參數(shù)visible=true
  • 后續(xù)會(huì)更新支持多個(gè)不同手風(fēng)琴,支持開啟手風(fēng)琴模式

結(jié)構(gòu)

    • 邊側(cè)導(dǎo)航欄結(jié)構(gòu)
<!-- 由于本身是封裝的一個(gè)邊側(cè)導(dǎo)航欄,所有組件中有
NLY-accordionNav
NLY-accordionNavItem
NLY-accordionNavTree
 -->
<NLY-accordionNav>
  <NLY-accordionNavItem icon="nlyblog nly-blog-home">
    Nejinn
  </NLY-accordionNavItem>
  <NLY-accordionNavTree icon="nlyblog nly-blog-book" v-nly-accordion.sss>
    Nejinn
  </NLY-accordionNavTree>
  <NLY-accordionNavCollapse id="sss" visible>
    <NLY-accordionNavItem icon="nlyblog nly-blog-home">
      lerity
    </NLY-accordionNavItem>
    <NLY-accordionNavItem icon="nlyblog nly-blog-home">
      blog
    </NLY-accordionNavItem>
  </NLY-accordionNavCollapse>
</NLY-accordionNav>
    • 只有手風(fēng)琴折疊版的結(jié)構(gòu)
<任意元素 v-nly-accordion.collapseId>
</任意元素元素>
<NLY-accordionNavCollapse id='collapseId'>
    ...嵌套元素,隨意插入
</NLY-accordionNavCollapse>

demo:
<div v-nly-accordion.collapse1>點(diǎn)擊我收起或展開 collapse1</div>
<NLY-accordionNavCollapse id='collapse1'>
  <a>我是折疊版中的元素</a>
</NLY-accordionNavCollapse>

<div v-nly-accordion.collapse2>點(diǎn)擊我收起或展開collapse2</div>
<NLY-accordionNavCollapse id='collapse2'>
  <a>我是折疊版中的元素</a>
</NLY-accordionNavCollapse>
使用這種結(jié)構(gòu)的時(shí)候,請(qǐng)注意自己寫css靶累∠俸粒可以在accordion.vue中修改就行。

組件目錄結(jié)構(gòu)

目錄結(jié)構(gòu).jpg

自定義指令 v-nly-accordion

  • nlyaccordion.js
// nlyaccordion.js
import Vue from "vue";

/**
 * 差集函數(shù)
 */
function getDifference(allCollapseId, idKeys) {
  let mixArray = [];
  allCollapseId.forEach(item => {
    if (idKeys.indexOf(item) == -1) {
      mixArray.push(item);
    }
  });
  return mixArray;
}

Vue.directive("nly-accordion", function(el, binding, vnode) {
  /**
   * 初始化指令時(shí)監(jiān)控collapseStatus事件,collapseStatus事件由NLY-accordionNavCollapse組件發(fā)出,有2個(gè)參數(shù),
   * 一個(gè)是NLY-accordionNavCollapse事件props參數(shù)id,
   * 一個(gè)是NLY-accordionNavCollapse折疊狀態(tài)show
   * function(a,b)中a是show,b是id
   */
  vnode.context.$root.$on("collapseStatus", function(a, b) {
    // 將所有提交collapseStatus事件的NLY-accordionNavCollapse組件的id放入allCollapseId
    if (allCollapseId.indexOf(b) == -1) {
      allCollapseId.push(b);
    }

    /**
     * 獲取當(dāng)前指令的modifiers,如果當(dāng)前指令的modifiers中包含提交collapseStatus事件的NLY-accordionNavCollapse組件的id
     * 則初始化掛載指令的組件或者element的class挣柬,且修改當(dāng)前指令modifiers為對(duì)應(yīng)的show值
     * 對(duì)應(yīng)的初始化show為true,則在當(dāng)前掛載指令的element的class中添加open
     * 對(duì)應(yīng)的初始化show為false,則在當(dāng)前掛載指令的element的class中移除open
     */
    let idKeys = Object.keys(binding.modifiers);
    if (idKeys.indexOf(b) != -1) {
      binding.modifiers[String(b)] = a;
      if (a) {
        el.classList.add("open");
      } else {
        el.classList.remove("open");
      }
    }
  });

  /**
   * 新建一個(gè)array儲(chǔ)存組件NLY-accordionNavCollapse的id
   * 注意會(huì)先執(zhí)行這里的代碼再執(zhí)行上面的代碼潮酒。
   */
  let allCollapseId = [];

  /**
   * 點(diǎn)擊事件
   */
  el.onclick = function() {
    // 獲取指令的modifiers
    let idKeys = Object.keys(binding.modifiers);
    // 求出modifiers和儲(chǔ)存所有id的數(shù)組的差集
    let mixArray = getDifference(allCollapseId, idKeys);

    /**
     * 循環(huán)當(dāng)前指令的modifiers,并循環(huán)當(dāng)前掛載指令實(shí)例的父組件的所有子組件
     * 以組件的id找出指令對(duì)應(yīng)的組件,執(zhí)行對(duì)應(yīng)的展開折疊動(dòng)作
     */
    idKeys.forEach(idKeysItem => {
      vnode.componentInstance.$parent.$children.forEach(childrenItem => {
        if (childrenItem.id == idKeysItem) {
          if (binding.modifiers[idKeysItem]) {
            childrenItem.show = false;
            el.classList.remove("open");
          } else {
            childrenItem.show = true;
            el.classList.add("open");
          }
        }
      });
    });
    /**
     * 判斷當(dāng)前指令的modifiers是否有對(duì)應(yīng)的NLY-accordionNavCollapse組件
     * 如果有就執(zhí)行關(guān)閉其他NLY-accordionNavCollapse組件的動(dòng)作,如果沒有,就不進(jìn)行操作
     */
    idKeys.forEach(idKeysItem => {
      if (allCollapseId.indexOf(idKeysItem) != -1) {
        mixArray.forEach(mixArrayItem => {
          vnode.componentInstance.$parent.$children.forEach(childrenItem => {
            if (childrenItem.id == mixArrayItem) {
              childrenItem.show = false;
              el.classList.remove("open");
            }
          });
        });
      }
    });
  };
});

動(dòng)畫過渡組件

  • 動(dòng)畫過渡組件是借鑒element-ui的,但是說實(shí)話邪蛔,我不是很喜歡這個(gè)急黎。
  • collapse動(dòng)畫在NLY-accordionNavCollapse組件中引入
<script>
    import collapse from "./collapse.js";
    export default {
        name: "AccordionNavCollapse",
        components: {
            collapse: collapse
        },
  • collapse.js
// collapse.js
const elTransition =
  "0.3s height ease-in-out, 0.3s padding-top ease-in-out, 0.3s padding-bottom ease-in-out";
const Transition = {
  "before-enter"(el) {
    el.style.transition = elTransition;
    if (!el.dataset) el.dataset = {};

    el.dataset.oldPaddingTop = el.style.paddingTop;
    el.dataset.oldPaddingBottom = el.style.paddingBottom;

    el.style.height = 0;
    el.style.paddingTop = 0;
    el.style.paddingBottom = 0;
  },

  enter(el) {
    el.dataset.oldOverflow = el.style.overflow;
    if (el.scrollHeight !== 0) {
      el.style.height = el.scrollHeight + "px";
      el.style.paddingTop = el.dataset.oldPaddingTop;
      el.style.paddingBottom = el.dataset.oldPaddingBottom;
    } else {
      el.style.height = "";
      el.style.paddingTop = el.dataset.oldPaddingTop;
      el.style.paddingBottom = el.dataset.oldPaddingBottom;
    }

    el.style.overflow = "hidden";
  },

  "after-enter"(el) {
    el.style.transition = "";
    el.style.height = "";
    el.style.overflow = el.dataset.oldOverflow;
  },

  "before-leave"(el) {
    if (!el.dataset) el.dataset = {};
    el.dataset.oldPaddingTop = el.style.paddingTop;
    el.dataset.oldPaddingBottom = el.style.paddingBottom;
    el.dataset.oldOverflow = el.style.overflow;

    el.style.height = el.scrollHeight + "px";
    el.style.overflow = "hidden";
  },

  leave(el) {
    if (el.scrollHeight !== 0) {
      el.style.transition = elTransition;
      el.style.height = 0;
      el.style.paddingTop = 0;
      el.style.paddingBottom = 0;
    }
  },

  "after-leave"(el) {
    el.style.transition = "";
    el.style.height = "";
    el.style.overflow = el.dataset.oldOverflow;
    el.style.paddingTop = el.dataset.oldPaddingTop;
    el.style.paddingBottom = el.dataset.oldPaddingBottom;
  }
};

export default {
  name: "collapseTransition",
  functional: true,
  render(h, { children }) {
    const data = {
      on: Transition
    };
    return h("transition", data, children);
  }
};

組件

NLY-accordionNav

// AccordionNav.vue
<template>
  <nav class="nly-blog-sider-nav flex-column">
    <ul class="nly-blog-sider-menu flex-column">
      <slot />
    </ul>
  </nav>
</template>
<script>
export default {
  name: "AccordionNav"
};
</script>

NLY-accordionNavItem

// AccordionNavItem.vue
<template>
  <li class="nly-blog-sider-menu-item">
    <a class="nly-blog-sider-menu-title">
      <i :class="iconClass" v-if="icon"> </i>
      <p>
        <slot />
      </p>
    </a>
  </li>
</template>

<script>
export default {
  name: "AccordionNavItem",
  props: {
    icon: {
      type: String
    }
  },
  computed: {
    iconClass: function() {
      return ["nly-blog-sider-menu-icon", this.icon];
    }
  }
};
</script>

NLY-accordionNavTree

// AccordionNavTree.vue
<template>
  <li class="nly-blog-sider-menu-item">
    <a class="nly-blog-sider-menu-title">
      <i :class="iconClass" v-if="icon"> </i>
      <p>
        <slot />
      </p>
      <i class="nly-blog-sider-menu-arrow"> </i>
    </a>
  </li>
</template>

<script>
export default {
  name: "AccordionNavTree",
  props: {
    icon: {
      type: String
    }
  },
  computed: {
    iconClass: function() {
      return ["nly-blog-sider-menu-icon", this.icon];
    }
  }
};
</script>

NLY-accordionNavCollapse

// AccordionNavCollapse.vue
<template>
  <collapse>
    <ul class="nly-blog-sider-menu menu-tree" v-show="show">
      <slot />
    </ul>
  </collapse>
</template>

<script>
import collapse from "./collapse.js";
export default {
  name: "AccordionNavCollapse",
  components: {
    collapse: collapse
  },
  data() {
    return {
      show: this.visible
    };
  },
  model: {
    prop: "visible",
    event: "input"
  },
  props: {
    visible: {
      type: Boolean,
      default: false
    },
    id: {
      type: [String, Number]
    }
  },
  created() {
    this.show = this.visible;
    this.$nextTick(function() {
      this.emitState();
    });
  },
  computed: {},
  methods: {
    emitState: function emitState() {
      // 告訴指令當(dāng)前id和show
      this.$root.$emit("collapseStatus", this.show, this.id);
    }
  },
  mounted() {},
  watch: {
    visible: function(newval, oldval) {
      if (newval != oldval) {
        this.show = newval;
      }
    },
    show: function show(newVal, oldVal) {
      if (newVal !== oldVal) {
        this.emitState();
      }
    }
  }
};
</script>

注冊(cè)組件

  • index.js
import AccordionNav from "./AccordionNav.vue";
import AccordionNavItem from "./AccordionNavItem.vue";
import AccordionNavTree from "./AccordionNavTree.vue";
import AccordionNavCollapse from "./AccordionNavCollapse.vue";

export default {
  install: Vue => {
    Vue.component("NLY-accordionNav", AccordionNav);
    Vue.component("NLY-accordionNavItem", AccordionNavItem);
    Vue.component("NLY-accordionNavTree", AccordionNavTree);
    Vue.component("NLY-accordionNavCollapse", AccordionNavCollapse);
  }
};

全局注冊(cè)指令和組件

  • main.js
import Vue from "vue";
import App from "./App.vue";
import router from "./router";
import store from "./store";

Vue.config.productionTip = false;

// 自定義圖標(biāo),阿里巴巴矢量圖標(biāo)庫(kù)
import "./assets/nlyblogfont/iconfont.css";

// 全局注冊(cè)組件
import NLYblog from "./nlyaccordion";
Vue.use(NLYblog);

// 全局注冊(cè)指令
import "./nlyaccordion/nlyaccordion.js";

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount("#app");

Less

  • 請(qǐng)把less放到app.vue或者手風(fēng)琴的父組件中
  • 也可以編譯成css,然后再引入
<style lang="less">
.flex-column {
  flex-direction: column !important;
}
.nly-blog-sider-nav {
  padding: 0.5rem 1.5rem 0.5rem 1rem;
  display: flex;
  flex-wrap: wrap;
  margin-bottom: 0;
  list-style: none;

  .nly-blog-sider-menu {
    margin-top: 1rem;
    list-style: none;

    &.menu-tree {
      margin-top: 0;
      margin-left: 1rem;
    }

    .nly-blog-sider-menu-item {
      padding: 0 1rem 0 1rem;

      &.open {
        > .nly-blog-sider-menu-title {
          i.nly-blog-sider-menu-arrow {
            transform: translateY(-2px);
          }
          i.nly-blog-sider-menu-arrow::after {
            transform: rotate(-45deg) translateX(-2px);
          }
          i.nly-blog-sider-menu-arrow::before {
            transform: rotate(45deg) translateX(2px);
          }
        }
      }
    }

    .nly-blog-sider-menu-title:hover {
      color: #0fbcf9;
      transition: color 0.3s ease-in;

      .nly-blog-sider-menu-arrow::after {
        background-color: #0fbcf9;
      }
      .nly-blog-sider-menu-arrow::before {
        background-color: #0fbcf9;
      }
    }

    .nly-blog-sider-menu-title {
      // color: inherit;
      white-space: nowrap;
      cursor: pointer;
      display: block;
      color: #f97f51;
      position: relative;
      padding: 0.2rem 0.5rem 0.2rem 0.5rem;
      transition: color 0.3s ease-in;

      .nly-blog-sider-menu-icon {
        // font-size: 1.8rem;
        margin-right: 0.5rem;
        color: inherit;
        // vertical-align: -0.3rem;
      }

      p {
        display: inline-block;
        // font-size: 1.3rem;
        color: inherit;
      }

      .nly-blog-sider-menu-arrow {
        position: absolute;
        top: 50%;
        right: 16px;
        width: 10px;
        transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
      }

      .nly-blog-sider-menu-arrow::before {
        transform: rotate(-45deg) translateX(2px);
        position: absolute;
        width: 6px;
        height: 1.5px;
        background-color: #f97f51;
        border-radius: 2px;
        transition: background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1),
          transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1),
          top 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
        content: "";
      }

      .nly-blog-sider-menu-arrow::after {
        transform: rotate(45deg) translateX(-2px);
        position: absolute;
        width: 6px;
        height: 1.5px;
        background-color: #f97f51;
        border-radius: 2px;
        transition: background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1),
          transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1),
          top 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
        content: "";
      }
    }
  }
}
</style>

Demo

<template>
  <NLY-accordionNav>
    <NLY-accordionNavItem icon="nlyblog nly-blog-home">
      Nejinn
    </NLY-accordionNavItem>

    <NLY-accordionNavTree icon="nlyblog nly-blog-book" v-nly-accordion.sss>
      Nejinn
    </NLY-accordionNavTree>
    <NLY-accordionNavCollapse id="sss" visible>
      <NLY-accordionNavItem icon="nlyblog nly-blog-home">
        lerity
      </NLY-accordionNavItem>
      <NLY-accordionNavItem icon="nlyblog nly-blog-home">
        blog
      </NLY-accordionNavItem>
    </NLY-accordionNavCollapse>

    <NLY-accordionNavTree icon="nlyblog nly-blog-book" v-nly-accordion.zzz>
      一顆
    </NLY-accordionNavTree>
    <NLY-accordionNavCollapse id="zzz">
      <NLY-accordionNavItem icon="nlyblog nly-blog-home">
        數(shù)據(jù)
      </NLY-accordionNavItem>
      <NLY-accordionNavItem icon="nlyblog nly-blog-home">
        小白菜
      </NLY-accordionNavItem>
    </NLY-accordionNavCollapse>

    <NLY-accordionNavTree icon="nlyblog nly-blog-book" v-nly-accordion.ccc>
      測(cè)試
    </NLY-accordionNavTree>
    <NLY-accordionNavCollapse id="ccc">
      <NLY-accordionNavItem icon="nlyblog nly-blog-home">
        黃色
      </NLY-accordionNavItem>
      <NLY-accordionNavItem icon="nlyblog nly-blog-home">
        藍(lán)色
      </NLY-accordionNavItem>
    </NLY-accordionNavCollapse>

    <NLY-accordionNavTree icon="nlyblog nly-blog-book" v-nly-accordion.ddd>
      大巴
    </NLY-accordionNavTree>
    <NLY-accordionNavCollapse id="ddd">
      <NLY-accordionNavItem icon="nlyblog nly-blog-home">
        上車
      </NLY-accordionNavItem>
      <NLY-accordionNavItem icon="nlyblog nly-blog-home">
        不開車就下車
      </NLY-accordionNavItem>
    </NLY-accordionNavCollapse>
  </NLY-accordionNav>
</template>

<script>
export default {
  name: "accordion"
};
</script>

<style lang="less">
.flex-column {
  flex-direction: column !important;
}
.nly-blog-sider-nav {
  padding: 0.5rem 1.5rem 0.5rem 1rem;
  display: flex;
  flex-wrap: wrap;
  margin-bottom: 0;
  list-style: none;

  .nly-blog-sider-menu {
    margin-top: 1rem;
    list-style: none;

    &.menu-tree {
      margin-top: 0;
      margin-left: 1rem;
    }

    .nly-blog-sider-menu-item {
      padding: 0 1rem 0 1rem;

      &.open {
        > .nly-blog-sider-menu-title {
          i.nly-blog-sider-menu-arrow {
            transform: translateY(-2px);
          }
          i.nly-blog-sider-menu-arrow::after {
            transform: rotate(-45deg) translateX(-2px);
          }
          i.nly-blog-sider-menu-arrow::before {
            transform: rotate(45deg) translateX(2px);
          }
        }
      }
    }

    .nly-blog-sider-menu-title:hover {
      color: #0fbcf9;
      transition: color 0.3s ease-in;

      .nly-blog-sider-menu-arrow::after {
        background-color: #0fbcf9;
      }
      .nly-blog-sider-menu-arrow::before {
        background-color: #0fbcf9;
      }
    }

    .nly-blog-sider-menu-title {
      // color: inherit;
      white-space: nowrap;
      cursor: pointer;
      display: block;
      color: #f97f51;
      position: relative;
      padding: 0.2rem 0.5rem 0.2rem 0.5rem;
      transition: color 0.3s ease-in;

      .nly-blog-sider-menu-icon {
        // font-size: 1.8rem;
        margin-right: 0.5rem;
        color: inherit;
        // vertical-align: -0.3rem;
      }

      p {
        display: inline-block;
        // font-size: 1.3rem;
        color: inherit;
      }

      .nly-blog-sider-menu-arrow {
        position: absolute;
        top: 50%;
        right: 16px;
        width: 10px;
        transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
      }

      .nly-blog-sider-menu-arrow::before {
        transform: rotate(-45deg) translateX(2px);
        position: absolute;
        width: 6px;
        height: 1.5px;
        background-color: #f97f51;
        border-radius: 2px;
        transition: background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1),
          transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1),
          top 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
        content: "";
      }

      .nly-blog-sider-menu-arrow::after {
        transform: rotate(45deg) translateX(-2px);
        position: absolute;
        width: 6px;
        height: 1.5px;
        background-color: #f97f51;
        border-radius: 2px;
        transition: background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1),
          transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1),
          top 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
        content: "";
      }
    }
  }
}
</style>

這時(shí)候運(yùn)行就可以看到效果圖的大手風(fēng)琴折疊板。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末侧到,一起剝皮案震驚了整個(gè)濱河市勃教,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌匠抗,老刑警劉巖故源,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異汞贸,居然都是意外死亡绳军,警方通過查閱死者的電腦和手機(jī)印机,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來门驾,“玉大人射赛,你說我怎么就攤上這事∧淌牵” “怎么了咒劲?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)诫隅。 經(jīng)常有香客問我腐魂,道長(zhǎng),這世上最難降的妖魔是什么逐纬? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任蛔屹,我火速辦了婚禮,結(jié)果婚禮上豁生,老公的妹妹穿的比我還像新娘兔毒。我一直安慰自己,他們只是感情好甸箱,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布育叁。 她就那樣靜靜地躺著,像睡著了一般芍殖。 火紅的嫁衣襯著肌膚如雪豪嗽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天豌骏,我揣著相機(jī)與錄音龟梦,去河邊找鬼。 笑死窃躲,一個(gè)胖子當(dāng)著我的面吹牛计贰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蒂窒,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼躁倒,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了洒琢?” 一聲冷哼從身側(cè)響起秧秉,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纬凤,沒想到半個(gè)月后福贞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撩嚼,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡停士,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年挖帘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恋技。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拇舀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜻底,到底是詐尸還是另有隱情骄崩,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布薄辅,位于F島的核電站要拂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏站楚。R本人自食惡果不足惜脱惰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窿春。 院中可真熱鬧拉一,春花似錦、人聲如沸旧乞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尺栖。三九已至嫡纠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間延赌,已是汗流浹背货徙。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留皮胡,地道東北人痴颊。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像屡贺,于是被迫代替她去往敵國(guó)和親蠢棱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 基本用法 一甩栈、vuejs簡(jiǎn)介 是一個(gè)構(gòu)建用戶界面的框架 是一個(gè)輕量級(jí)的MVVM(Model-View-ViewMo...
    深度剖析JavaScript閱讀 18,246評(píng)論 0 8
  • 這個(gè)命題作文考生容易下筆泻仙,沒有審題障礙,不會(huì)跑題偏題量没。 我們發(fā)散思維玉转,可以看見自我,比如看見最好的自己殴蹄,看見自...
    詩(shī)語人生閱讀 1,019評(píng)論 0 0
  • 年不知不覺就走到了你跟前究抓,你或許還沒有反應(yīng)猾担,但必須適應(yīng)年的到來,年尾是一年之中最忙碌的日子刺下,也是記憶中最難...
    浪子青海閱讀 253評(píng)論 0 1
  • 誦讀绑嘹,不是簡(jiǎn)單的讀,它是一門藝術(shù)橘茉。只會(huì)讀不會(huì)誦最高只能達(dá)到誦讀的初級(jí)水平工腋,會(huì)讀會(huì)誦才有可能達(dá)到誦讀的最高水平。誦讀...
    安定區(qū)張虎閱讀 1,122評(píng)論 4 4
  • 今天正式開始了我的洋蔥閱讀課畅卓。小六老師在開營(yíng)儀式上講了為什么要閱讀擅腰,要怎樣閱讀,以及洋蔥閱讀的體系翁潘,總結(jié)起來就是實(shí)...
    嘮叨妖的雞娃日記閱讀 666評(píng)論 3 6