欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Steps 步骤条

程序员文章站 2022-03-04 10:57:08
...

概述

1 .拆分某项流程的步骤,引导用户按照流程完成任务
2 .这里项目结构又可以分开一步了

1 .steps.vue
<template>
    <div class="steps">
        <h1>{{name}}</h1>
    </div>
</template>
<script src="./step.js"></script>
<style lang="less" src="./index.less"></style>

2 .step.js
export default{
    data:function(){
        return {
            name:'steps'
        }
    }
}

3 .index.less
@name:.steps;

@{name}{
    border:@border;
}
4 .这样代码更加分开。把js部分也分开,主要是每次找的时候上下翻的好麻烦,这样可以对照html结构来操作
5 .本来以为这样会导致一些bug,但是搞了一晚上之后又使用最一开始的方法又好了,真是日了。。。。这也太不稳定了吧
6 .还是不要把js分出来了吧,现在发现会有很多问题,而且分的好像太细了文件夹太多了,操作起来更麻烦了,之后还是按照情况分类吧,少的就不分出去了。。
7 .还有新版本的vue-cli 每次编译就出错,真是爆炸了
8 .这个果然会报这个错误
9 .import Step from '@/components/base/steps/son/step' 之前的引入,都是后面不加.vue的
10 .现在把js分出去之后,好像会编译不到。可能是没有及时从src把代码拉回来,也可能是有一个js文件导入import的路径有问题。
11 .这就奇怪了,把每种情况都试了下,关键是不能稳定重现。每次出现的条件都不是必须的,日了。还是看下.vue文件的官方推荐组件写法吧,不要自己开创了
12 .但是官方有例子的
<!-- my-component.vue -->
<template>
  <div>This will be pre-compiled</div>
</template>
<script src="./my-component.js"></script>
<style src="./my-component.css"></style>

3 .别人的抽离方式:并不是直接使用src

export default {
  data () {
    return {
    }
  },
  mounted () {
    console.log(this.$store.state.username)    // test
  }
}

import navbarJs from  '../assets/js/navbar.js'
export default {
  ...navbarJs
}

4 .其实无论怎么看这个组件的功能还是传入的参数,都没有必要写成slot的写法,这样用的时候还要额外引入一个组件
5 .但是还是发现了一个新问题,也不算很亏吧
6 .

代码

<template>
    <div class="steps">
        <Step 
            v-for="(x,index) in options"
            v-bind:options="x"
            v-bind:index="index"
             />
    </div>
</template>
<script>
import Step from './son/step.vue'
export default {
    components:{Step},
    props:{
        current:{
            type:Number,
            default:0,
        },
        options:{
            type:Array,
            default:[]
        }
    }
}
</script>

<style lang="less" src="./steps.less"></style>

1 .其他的状态可能需要在传一个值。比如这一步失败变成红色样式那种,现在好像只能显示进行到了那一步
2 .要做一个全部完成的一个总完成状态,就像promise all用法一样

<template>
    <div class="step">
        <div class="step_head">
            <div class="step_icon">
                <svg class="step_icon_icon" aria-hidden="true" :class="computedClass">
                    <use xlink:href="#icon-gongjuxiang-copy"></use>
                </svg>
            </div>
            <div class="step_title" :class="computedClass">
                    {{computedTitle}}
            </div>
            <div class="step_xian" v-if="index!=this.$parent.options.length-1" :class="computedXianClass"></div>

        </div>
        <div class="step_footer">
            {{options.content}}
        </div>
    </div>
</template>
<script>
// import haha from './haha.js'
// export default{
//     ...haha
// }

export default{
    props:{
        options:{
            type:Object,
            default:function(){
                return {
                    title:'步骤标题',
                    content:'需要一些解释,来描述这一个步骤是干啥滴',
                    icon:'步骤图标'
                }
            }
        },
        index:{
            type:Number,
            required:true,
        }
    },
    computed:{
        computedClass(){
            if(this.index+1==this.$parent.current){
                return 'step_finish'
            }else if(this.index+1<this.$parent.current){
                return 'step_finish'
            }else{
                return ''
            }
        },
        computedXianClass(){
            if(this.index+1==this.$parent.current){
                return 'step_xian_finish'
            }else if(this.index+1<this.$parent.current){
                return 'step_xian_finish'
            }else{
                return ''
            }
        },
        computedTitle(){
            if(this.index+1<this.$parent.current){
                return '已完成'
            }else{
                return this.options.title
            }
        }
    }
}
</script>
<style lang="less" src="./step.less"></style>