需求
先看效果图
 
对vue来说,element-UI是有相应的轮播组件(走马灯)的,但相对简单的
 
 如上面的两头大中间小轮播,element上文档这款很类似,但不适用,因为卡片之间底层移动和间距是依赖js实现的,当页面存在间距而且不同页面需要适配时,我从控制css样式层面很难实现。
所以有了这个组件的封装
提示:
本组件
1、封装中只使用了一些网络资源图片
2、提供了初始化默认是数据
3、使用插槽默认一些代码布局
属于拿来代码导入即可直接看到效果的
实现
vue-awesome-swiper安装
对vue-awesome-swiper来说,版本不同会出现很多问题(比如导入的css文件位置)
swiper和vue-awesome-swiper的版本一定要相对应
版本安装
npm i swiper@4.5.1 vue-awesome-swiper@3.1.3 --save
"swiper": "^4.5.1",
"vue-awesome-swiper": "^3.1.3",
代码
提供了网络图片的默认数据sceneCardList
提供了slot插槽供提供布局代码
组件封装代码
<template>
  <div class="main-conent main-conent-screen main-conent-bgFFF main-conent-borderradius">
    <div class="swiper">
      <swiper v-slot="{item}" :swiperlist="sceneCardList" @selectItem="selectItem">
        <div class="CasesCard-li" @click="selectItem(item)">
          <img :src="item.url" alt="">
          <div class="info">
            <img :src="item.img" alt="">
            <div class="CasesCard-li-name">{{ item.text }}</div>
            <div class="CasesCard-li-text">
              --{{ item.name }}
            </div>
          </div>
        </div>
      </swiper>
    </div>
    <div class="screen-header">
      <el-row>
        <el-col :span="8">
          <el-button v-hasPermi="['3']" type="primary" icon="el-icon-plus">新增</el-button>
          <el-dropdown class="margin-l10">
            <el-button type="primary" icon="el-icon-plus">
              更多操作<i class="el-icon-arrow-down el-icon--right" />
            </el-button>
            <el-dropdown-menu slot="dropdown">
              <el-dropdown-item>批量删除</el-dropdown-item>
              <el-dropdown-item>批量审批</el-dropdown-item>
              <el-dropdown-item>批量编辑</el-dropdown-item>
            </el-dropdown-menu>
          </el-dropdown>
        </el-col>
        <el-col :span="16" class="text-right">
          <el-input
            v-model="search"
            class="margin-l10"
            style="width:200px;"
            placeholder="请输入搜索内容"
          >
            <i slot="suffix" class="el-input__icon el-icon-search cursor-pointer" />
          </el-input>
        </el-col>
      </el-row>
    </div>
    <screen-table
      class="screen-conent assets-grey-theme-table"
      table-class="custom-table"
      header-row-class-name="custom-table-header"
      :data="tableData"
    >
      <el-table-column
        fixed
        type="selection"
        width="55"
      />
      <el-table-column
        fixed
        prop="date"
        label="日期"
        width="150"
      />
      <el-table-column
        prop="name"
        label="姓名"
        min-width="120"
      />
      <el-table-column
        prop="province"
        label="省份"
        min-width="120"
      />
      <el-table-column
        prop="city"
        label="市区"
        min-width="120"
      />
      <el-table-column
        prop="address"
        label="地址"
        min-width="300"
      />
      <el-table-column
        prop="zip"
        label="邮编"
        min-width="120"
      />
      <el-table-column
        fixed="right"
        label="操作"
        width="100"
      >
        <template slot-scope="scope">
          <el-button type="text" @click="handleClick(scope.row)">查看</el-button>
          <el-dropdown class="margin-l5">
            <span class="cursor-pointer">
              <el-button type="text">更多<i class="el-icon-arrow-down el-icon--right" /></el-button>
            </span>
            <el-dropdown-menu slot="dropdown">
              <el-dropdown-item @click.native="tableEdit(scope.row)">编辑</el-dropdown-item>
              <el-dropdown-item @click.native="tableDel(scope.row)">删除</el-dropdown-item>
            </el-dropdown-menu>
          </el-dropdown>
        </template>
      </el-table-column>
    </screen-table>
    <el-link v-clipboard:copy="value" v-clipboard:success="clipboardSuccess" :underline="false" icon="el-icon-document-copy" style="float:right">复制</el-link>
    <pre>{{ value }}</pre>
    <div class="screen-footer text-right">
      <el-pagination
        background
        layout="sizes, prev, pager, next, total"
        :page-sizes="[10, 20, 50, 100]"
        :total="1000"
      />
    </div>
    <breadcrumb />
    <!-- <tui-editor ref="tuieditor" v-model="content" />
    <tui-editor-viewer v-model="content" /> -->
    <!-- 建议使用以下的编辑器 -->
    <!-- <mavon-editor
      v-model="content"
      :subfield="false"
      :toolbars-flag="true"
      :box-shadow="false"
      default-open="edit"
      preview-background="#FFFFFF"
    />
    <CKEditor v-model="editorData" /> -->
    <quillEditor />
    <tree-table
      :data="treeData"
      class="height-100"
      :column="treeTableColumn"
      node-key="id"
    >
      <template v-slot:default="{ node, treeData }">
        <el-button
          type="text"
          size="mini"
          @click.stop="add(node.level, treeData)"
        >
          新增下级
        </el-button>
        <el-button
          type="text"
          size="mini"
          @click.stop="add(node.level, treeData)"
        >
          修改
        </el-button>
        <el-button
          type="text"
          size="mini"
          @click.stop="del(treeData)"
        >
          删除
        </el-button>
      </template>
    </tree-table>
  </div>
</template>
<script>
import ScreenTable from '@/components/ScreenTable'
import Breadcrumb from '@/components/Breadcrumb'
import quillEditor from '@/components/quillEditor'
import TuiEditor from '@/components/TuiEditor'
import TuiEditorViewer from '@/components/TuiEditor/Viewer'
import MavonEditor from '@/components/MavonEditor'
import CKEditor from '@/components/CKEditor'
import TreeTable from '@/components/TreeTable'
import swiper from './swiper/index.vue'
import yiliao from '@/assets/images/cooperate/yiliao.png'
import juxing from '@/assets/images/cooperate/矩形(3).png'
export default {
  components: {
    ScreenTable,
    Breadcrumb,
    quillEditor,
    TreeTable,
    swiper
    // CKEditor,
    // TuiEditor,
    // TuiEditorViewer,
    // MavonEditor
  },
  data() {
    return {
      sceneCardList: [
        {
          name: '联想集团',
          text: '在国能云IoT物联网使能服务的基础上,帮助企业了解完整的设备全生命周期管理能力数据,提供设备物模型,简化物联网应用开发难度、缩短开发时间,降低物联网应用开…',
          img: yiliao,
          url: juxing
        },
        {
          name: '联想集团',
          text: '在国能云IoT物联网使能服务的基础上,帮助企业了解完整的设备全生命周期管理能力数据,提供设备物模型,简化物联网应用开发难度、缩短开发时间,降低物联网应用开…',
          go: '前往云市场',
          img: yiliao,
          url: juxing
        },
        {
          name: '联想集团',
          text: '在国能云IoT物联网使能服务的基础上,帮助企业了解完整的设备全生命周期管理能力数据,提供设备物模型,简化物联网应用开发难度、缩短开发时间,降低物联网应用开…',
          img: yiliao,
          url: juxing
        },
        {
          name: '联想集团',
          text: '在国能云IoT物联网使能服务的基础上,帮助企业了解完整的设备全生命周期管理能力数据,提供设备物模型,简化物联网应用开发难度、缩短开发时间,降低物联网应用开…',
          go: '前往云市场',
          img: yiliao,
          url: juxing
        },
        {
          name: '联想集团',
          text: '在国能云IoT物联网使能服务的基础上,帮助企业了解完整的设备全生命周期管理能力数据,提供设备物模型,简化物联网应用开发难度、缩短开发时间,降低物联网应用开…',
          go: '前往云市场',
          img: yiliao,
          url: juxing
        },
        {
          name: '联想集团',
          text: '在国能云IoT物联网使能服务的基础上,帮助企业了解完整的设备全生命周期管理能力数据,提供设备物模型,简化物联网应用开发难度、缩短开发时间,降低物联网应用开…',
          go: '前往官方文档',
          img: yiliao,
          url: juxing
        }
      ],
      content: '# This is Test.',
      contentHtml: '',
      search: '',
      value: '123test',
      editorData: '<p>Content of the editor.</p>',
      tableData: [
        {
          date: '2016-05-02',
          name: '王小虎',
          province: '上海',
          city: '普陀区',
          address: '上海市普陀区金沙江路 1518 弄',
          zip: 200333
        },
        {
          date: '2016-05-04',
          name: '王小虎',
          province: '上海',
          city: '普陀区',
          address: '上海市普陀区金沙江路 1517 弄',
          zip: 200333
        },
        {
          date: '2016-05-01',
          name: '王小虎',
          province: '上海',
          city: '普陀区',
          address: '上海市普陀区金沙江路 1519 弄',
          zip: 200333
        },
        {
          date: '2016-05-03',
          name: '王小虎',
          province: '上海',
          city: '普陀区',
          address: '上海市普陀区金沙江路 1516 弄',
          zip: 200333
        },
        {
          date: '2016-05-02',
          name: '王小虎',
          province: '上海',
          city: '普陀区',
          address: '上海市普陀区金沙江路 1518 弄',
          zip: 200333
        },
        {
          date: '2016-05-04',
          name: '王小虎',
          province: '上海',
          city: '普陀区',
          address: '上海市普陀区金沙江路 1517 弄',
          zip: 200333
        },
        {
          date: '2016-05-01',
          name: '王小虎',
          province: '上海',
          city: '普陀区',
          address: '上海市普陀区金沙江路 1519 弄',
          zip: 200333
        },
        {
          date: '2016-05-03',
          name: '王小虎',
          province: '上海',
          city: '普陀区',
          address: '上海市普陀区金沙江路 1516 弄',
          zip: 200333
        },
        {
          date: '2016-05-02',
          name: '王小虎',
          province: '上海',
          city: '普陀区',
          address: '上海市普陀区金沙江路 1518 弄',
          zip: 200333
        },
        {
          date: '2016-05-04',
          name: '王小虎',
          province: '上海',
          city: '普陀区',
          address: '上海市普陀区金沙江路 1517 弄',
          zip: 200333
        }
      ],
      treeTableColumn: [
        {
          title: '分类列表',
          label: 'label1',
          minWidth: 300
        },
        {
          title: '简称',
          label: 'short',
          minWidth: 300
        }
      ],
      treeData: [
        {
          id: 1,
          label1: '一级 1',
          short: 'one 1',
          children: [{
            id: 4,
            label1: '二级 1-1',
            short: 'two 1-1',
            content: '111',
            children: []
          }]
        },
        {
          id: 2,
          label1: '一级 2',
          short: 'one 2',
          children: [{
            id: 5,
            label1: '二级 2-1',
            short: 'two 2-1'
          }, {
            id: 6,
            label1: '二级 2-2',
            short: 'two 2-3'
          }]
        },
        {
          id: 3,
          label1: '一级 3',
          short: 'one 3',
          children: [{
            id: 7,
            label1: '二级 3-1',
            short: 'tow 3-1'
          }, {
            id: 8,
            label1: '二级 3-2',
            short: 'tow 3-2'
          }]
        },
        {
          id: 20,
          label1: '一级 4',
          short: 'one 4',
          children: [{
            id: 21,
            label1: '二级 4-1',
            short: 'tow 4-1'
          }, {
            id: 22,
            label1: '二级 4-2',
            short: 'tow 4-2'
          }]
        },
        {
          id: 30,
          label1: '一级 5',
          short: 'one 5',
          children: [{
            id: 31,
            label1: '二级 5-1',
            short: 'tow 5-1'
          }, {
            id: 32,
            label1: '二级 5-2',
            short: 'tow 5-2'
          }]
        }
      ]
    }
  },
  created() {
    this.$EventBus.$on('changePrice', (oldPrice, newPrice) => {
      console.log(oldPrice, newPrice)
    })
    this.$EventBus.$emit('changePrice', 100, 200)
  },
  methods: {
    selectItem(item) {
      // 对选中的swiper项进行处理
      console.log('选中的swiper项', item)
    },
    add(level, data) {
      console.log(level, data)
      this.$message({
        message: '这里可以显示一个弹框表单',
        type: 'success'
      })
    },
    del(data) {
      console.log(data)
      this.$confirm('是否确认删除?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        this.$message({
          message: '删除成功',
          type: 'success'
        })
      }).catch(() => {})
    },
    getContent() {
      this.contentHtml = this.$refs.tuieditor.getHtml()
    },
    imgUpload(fileOrBlob, callback) {
      var formdata = new FormData()
      formdata.append('image', fileOrBlob)
      console.log(formdata, fileOrBlob)
      /*
        // ajax上传
        request({
            url: '/upload/img',
            method: 'post',
            data: formdata,
            headers: { 'Content-Type': 'multipart/form-data' }
        }).then(res => {
            const { data } = res;
            const { url, name } = data;
            callback(url, name);
        }).catch(err => {
            console.log(err);
        }); */
      callback('https://gitee.com/lqsong/public/raw/master/common/Alipay.png', '赞助码')
    },
    /** 高亮显示 */
    highlightedCode(code, key) {
    },
    /** 复制代码成功 */
    clipboardSuccess() {
      this.$modal.msgSuccess('复制成功')
    },
    handleClick(row) {
      console.log(row)
    },
    tableEdit(row) {
      console.log(row)
    },
    tableDel(row) {
      this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        console.log(row)
        this.$message({
          type: 'success',
          message: '删除成功!'
        })
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消删除'
        })
      })
    }
  }
}
</script>
// 默认的插槽布局
<style lang="scss" scoped>
.swiper{
  height: 350px;
  position: relative;
}
.CasesCard-li{
  width: 457px;
  height: 350px;
  background: linear-gradient(180deg, #DFE4F0 0%, #FFFFFF 17%, #FFFFFF 100%);
  box-shadow: 4px 7px 18px 0px rgba(0,0,0,0.1);
  border-radius: 4px;
  margin-right: 32px;
  &-text{
    margin-top: 20px;
    display: flex;
    align-items: center;
    font-size: 14px;
    font-family: PingFangSC-Regular, PingFang SC;
    font-weight: 400;
    color: #4E5969;
    text-shadow: 4px 8px 20px rgba(0,0,0,0.1);
    justify-content: end;
  }
  >img{
    width: 100%;
    height: 145px;
  }
  .info{
    height: 205px;
    background: linear-gradient(180deg, #DFE4F0 0%, #FFFFFF 17%, #FFFFFF 100%);
    box-shadow: 4px 7px 18px 0px rgba(0,0,0,0.1);
    border-radius: 4px;
    padding: 0 32px;
    font-size: 14px;
    font-family: PingFangSC-Regular, PingFang SC;
    font-weight: 400;
    color: #4E5969;
    line-height: 20px;
    text-shadow: 4px 8px 20px rgba(0,0,0,0.1);
    >img{
      height: 48px;
      box-shadow: 4px 8px 20px 0px rgba(0,0,0,0.1);
      border-radius: 4px;
      margin-bottom: 16px;
      margin-top: 8px;
    }
  }
}
</style>
使用
导入组件
import swiper from './swiper/index.vue'
components: {
    swiper
  },
直接使用
// 直接使用
<swiper />
直接使用修改option配置项
// 直接使用
<swiper :swiper-option="options"/>
传递数据
<swiper :swiperlist="sceneCardList"></swiper>
数据格式:{
     name: '联想集团',
     text: '在国能云IoT物联网使能服务的基础上',
     img: url,
     url: url  
}
传递数据并修改布局
<swiper v-slot="{item}" :swiperlist="sceneCardList">
   <div class="CasesCard-li">
     <img :src="item.url" alt="">
     <div class="info">
       <img :src="item.img" alt="">
       <div class="CasesCard-li-name">{{ item.text }}</div>
       <div class="CasesCard-li-text">
         --{{ item.name }}
       </div>
     </div>
   </div>
 </swiper>



















