侧边栏壁纸
博主头像
Angel博主等级

行动起来,活在当下

  • 累计撰写 20 篇文章
  • 累计创建 8 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录
Vue

问题整理

Angel
2023-07-12 / 0 评论 / 0 点赞 / 68 阅读 / 29731 字
温馨提示:
本文最后更新于 2023-08-23,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
  1. a链接的herf属性
<a herf="#id">点我发生锚点跳转</a>

<div id="id">跳转到这里</div>  
  1. scrollIntoView()方法
<div id="id" onClick="handelClick">点我发生锚点跳转</div>

在methods中
handelClick () {
  document.querySelector('#id').scrollIntoView(true)
} 

***项目中优化css过大的问题

  1. 使用公共的样式文件
  2. 在引入公共的样式文件时前加 reference

##@import 属性的作用

  1. reference:使用该less文件但是不输出它
  2. inline:包括在源文件中输出,但是不做处理
  3. less:讲改文件试问less文件,无论扩展名是什么
  4. css:讲文件视为css文件
  5. once:改文件仅可导入一次
  6. multiple:该文件可以多次导入
  7. optional: 当没有发现文件是仍然编译
@import (reference) "src/less/comm";

***Git无法检测到文件名大小写的更改

git默认配置为忽略大小写

解决办法:

在当前项目中,运行git config core.ignorecase false, 关闭git忽略大小写配置,即可检测到大小写名称更改

***VUE 路由参数变化,页面数据不刷新问题

watch监听路由是否变化


watch: {
  // 方法1
  '$route' (to, from) { //监听路由是否变化
    if(this.$route.params.articleId){// 判断条件1  判断传递值的变化
      //获取文章数据
    }
  } 
    //方法2 
  '$route'(to, from) {
    if (to.path == "/page") {  /// 判断条件2  监听路由名 监听你从什么路由跳转过来的
       this.message = this.$route.query.msg     
    }
  }  
}


// to跳转之后的路由对象  from跳转之前的路由对象 


 方案三(最实用) 
beforeRouteUpdate (to, from, next) {
        if (to.params) {
            // 写要发起的请求 业务实现代码
            const { id1, id2 } = to.params
            this.getClassGoodsList({ id1, id2 })
        }
        next()
    }, 

***Vue实现淡入淡出效果

vue实现淡入淡出效果 
   html里面 
  
  <transition name="Fade">  
  中间需要包住有v-if或v-show的div
  </transition>

 style里面 

.Fade-enter,
.Fade-leave-to {
  opacity: 0;
}
.Fade-enter-to,
.Fade-leave {
  opacity: 1;
}

.Fade-enter-active,
.Fade-leave-active {
  transition: all .2s;
}

***在遮罩层下 页面禁止滚动

在父盒子上监听触摸移动和鼠标滚轮事件

@touchmove.prevent @mousewheel.prevent

// @touchmove 是触摸移动事件
// @mousewheel 是鼠标滚轮事件 
// prevent 阻止默认事件 
<!--购物车遮罩层-->
<van-overlay :show="isShow"  @mousewheel.prevent >  1. 先阻止默认行为
    <div class="cart-overlay"  @mousewheel.stop >   2. 在阻止事件冒泡
        <div class="cart-div p-24">
            <div class="flex">
                <div class="font-size-22 pl-16 pt-16 font-weight-550">{{ Lang['购物车'] }}</div>
                <div class="pr-16 pt-16">
                    <Icon name="cross" color="#9c9c9c" @click="back" />
                </div>
            </div>
            <!--购物车信息组件-->
            <Cart />
            <Divider />
            <!--合计价格组件-->
            <TotalPricePanel />
            <!--    立即购买按钮-->
            <div class="flex flex-end pr-16 pb-16">
                <Button class="theme" size="normal" @click="orders">
                    <Icon name="shopping-cart-o" />
                    {{ Lang['立即购买'] }}
                </Button>
            </div>
        </div>
    </div>
</van-overlay>

***移动端响应式

媒体查询比较方便 书写格式如下

@media screen and (max-width: 768px) {
  // 里面写屏幕样式变化即可
}

max-width  即最大宽度表示移动端
min-width  即最小宽度表示pc端 

***vue自定义组件监听不到事件解决办法

自定义组件中注册的事件是组件自定义的事件,不是原生dom中的事件,所以不会被监听到

在某个组件的根元素上绑定事件 就用事件修饰符 .native

<a-my-test @click .native ="childClick" ></a-my-test>

***页面元素隐藏方式

  • vue中的v-if
  • css中的 display: none // 二者都可以让元素隐藏且不占位

***保存两位小数的方法

// 保存两位小数的函数
  towNumber (val) {
      if (val) {
          return val.toFixed(2)
      }
  },
  
  
   vue中使用方法  
  
  <div>{{ towNuumber('想要保存两位数的数据') }} 

***文本首行缩进

text-indent: 2em;

***路由重复报错

// 在router里index.js文件中加

const routerPush = Router.prototype.push
Router.prototype.push = function push (location) {
    return routerPush.call(this, location).catch(error => error)
}

***商品规格案例

  • 类似淘宝购买商品时的规格选择
    <body>
        <div id='app'>
            <!-- 界面 -->
            <h2>颜色</h2>
            <div class="row">
                <div v-for="(item, i) in Color" :class="{ active: selectColor === item }" class="box" @click="option1Click(item)">{{ item }}</div>
            </div>
            <h2>尺码</h2>
            <div class="row">
                <div v-for="(item, i) in Size" :class="{ active: selectSize === item, box1: SizeData.indexOf(item) === -1 }" class="box" @click="option2Click(item)">{{ item }}</div>
            </div>
            <h2>套餐</h2>
            <div class="row">
                <div v-if="item" v-for="(item, i) in Gift" :class="{ active: selectGift === item, box1: GiftData.indexOf(item) === -1 }" class="box" @click="option3Click(item)">{{ item }}</div>
            </div>
            <div v-if="GiftColor.length">
                <h2>赠品</h2>
                <div style="width: 800px;">
                    <h3>规格1</h3>
                    <div class="row">
                        <div v-if="GiftColor" class="box" @click="option4Click(item)" :class="{ active: selectGiftColor === item }" v-for="(item) in GiftColor">{{ item }}</div>
                    </div>
                    <h3 v-if="GiftSize.length">规格2</h3>
                    <div class="row">
                        <div class="box" @click="option5Click(item)" :class="{ active: selectGiftSize === item, box1: GiftColorData.indexOf(item) === -1 }" v-for="(item) in GiftSize">{{ item }}</div>
                    </div>
                </div>
            </div>
            <!-- 合计 -->
            <div>合计:{{ allPrice }}</div>
            <div>折扣:{{ discount }}</div>
            <div>实付:{{ allPrice - discount }}</div>
        </div>
        <script>
            let vm = new Vue({
                el: '#app',
                data: {
                    // goods, giftList, promotionList 是接口返回的原始数据,(不能改动,只能用)其他随意发挥
                    // 实现商品规格的选择,同时根据显示赠品供用户选择,同时根据促销策略进行优惠
                    goods: { /*商品信息*/
                        name: '牛仔裤',
                        specList: [{
                            option1: '蓝色',
                            option2: 'S',
                            option3: '送皮带',
                            price: 100,
                            giftId: 2,
                            /* 关联的 赠品id */
                            giftNumber: 1,
                            /* 送赠品的数量 */
                        }, {
                            option1: '蓝色',
                            option2: 'M',
                            option3: '送皮带',
                            price: 100,
                            giftId: 2,
                            giftNumber: 1,
                        }, {
                            option1: '红色',
                            option2: 'M',
                            option3: '送皮带',
                            price: 100,
                            giftId: 2,
                            giftNumber: 1,
                        }, {
                            option1: '红色',
                            option2: 'L',
                            option3: '送袜子',
                            price: 200,
                            giftId: 1,
                            giftNumber: 1,
                        }, {
                            option1: '黄色',
                            option2: 'L',
                            option3: '送皮带',
                            price: 100,
                            giftId: 2,
                            giftNumber: 1,
                        }, {
                            option1: '绿色',
                            option2: '均码',
                            option3: '',
                            price: 80
                        }, {
                            option1: '黑色',
                            option2: '不分大小',
                            option3: '送袜子',
                            price: 200,
                            giftId: 1,
                            giftNumber: 1,
                        }]
                    },
                    giftList: [ /* 赠品 */ {
                        id: 1,
                        /* 赠品id */
                        name: '袜子',
                        /* 赠品名 */
                        specList: [ /* 赠品规格 */ {
                            option1: '黑色',
                            option2: '均码',
                            option3: ''
                        }, {
                            option1: '白色',
                            option2: '均码',
                            option3: ''
                        }]
                    }, {
                        id: 2,
                        name: '皮带',
                        specList: [{
                            option1: '均码',
                            option2: '',
                            option3: ''
                        }]
                    }],
                    promotionList: [ /* 促销策略,根据用户选择的价格进行满减 */ {
                        type: 1,
                        /* 1代表 合计优惠 */
                        price: 100,
                        /* 满100 */
                        offPrice: 10 /* 减10 */
                    }, {
                        type: 1,
                        price: 200,
                        /* 满200 */
                        offPrice: 30 /* 减30 */
                    }],
                    Color: [],  //  所有颜色
                    Size: [],   //  所有尺寸
                    Gift: [],   //  所有套餐
                    selectColor: '',    //  选中的颜色
                    selectSize: '',     //  选中的尺寸
                    selectGift: '',     //  选中的套餐
                    SizeData: [],       //  选中颜色下的尺寸
                    GiftData: [],       //  选中尺寸下的套餐
                    GiftColor: [],      //  赠品所有的颜色
                    selectGiftColor: '',//  选中赠品的颜色
                    giftId: '',         //  赠品的id
                    GiftSize: [],       //  赠品的所有规格
                    GiftColorData: [],  //  选中赠品颜色的规格
                    selectGiftSize: '', //  选中赠品的规格2数据
                    allPrice: 0,        //  合计
                    discount: 0         //  折扣
                },
                created() {
                    this.goods.specList.forEach(item => {
                        this.Color.push(item.option1)
                        this.Size.push(item.option2)
                        this.Gift.push(item.option3)
                        this.Color = [...new Set(this.Color)]
                        this.Size = [...new Set(this.Size)]
                        this.Gift = [...new Set(this.Gift)]
                    })
                },
                watch: {},
                methods: {
                    option1Click(item) {
                        this.selectColor = item
                        this.SizeData = []
                        this.selectSize = []
                        this.selectGift = []
                        this.GiftColor = []
                        this.selectGiftSize = []
                        this.GiftSize = []
                        this.allPrice = 0
                        this.discount = 0
                        this.selectGiftColor = ''
                        this.SizeData.push(this.goods.specList.filter(item => item.option1 === this.selectColor).map(item => item.option2))
                        this.SizeData = this.SizeData[0]
                    },
                    option2Click(item) {
                        // 禁止选择是虚线边框的规格
                        if (this.SizeData.indexOf(item) === -1) return false
                        this.selectSize = item
                        this.GiftData = []
                        this.selectGift = []
                        this.GiftColor = []
                        this.selectGiftSize = []
                        this.GiftSize = []
                        this.GiftData.push(this.goods.specList.filter(item => item.option2 === this.selectSize).filter(item => item.option1 === this.selectColor).map(item => item.option3))
                        this.GiftData = this.GiftData[0].filter(Boolean)  // 过滤数组中的虚假值  arr.filter(Boolean)
                        if(this.GiftData.length === 0) this.total()
                    },
                    option3Click(item) {
                        // 禁止选择是虚线边框的规格
                        if (this.GiftData.indexOf(item) === -1) return false
                        this.selectGift = item
                        this.GiftColor = []
                        this.selectGiftSize = []
                        this.GiftSize = []
                        this.total()
                    },
                    option4Click(item) {
                        this.selectGiftColor = item
                        this.GiftColorData = []
                        this.selectGiftSize = []
                        this.GiftColorData.push(this.giftList.find(item => this.giftId === item.id).specList.filter(item => item.option1 === this.selectGiftColor).map(item => item.option2))
                        this.GiftColorData = this.GiftColorData[0]
    
                    },
                    option5Click(item) {
                        this.selectGiftSize = item
                    },
                    total () {  // 合计函数
                        this.goods.specList.forEach(item => {
                                if (this.selectColor === item.option1 && this.selectSize === item.option2) {
                                    this.giftId = item.giftId
                                    this.allPrice = item.price // 合计价钱
                                    this.giftList.find(item => this.giftId === item.id) ? this.giftList.find(item => this.giftId === item.id).specList.forEach(item => {
                                        this.GiftColor.push(item.option1)
                                        this.GiftSize.push(item.option2)
                                        this.GiftSize = [...new Set(this.GiftSize)].filter(Boolean) // 过滤数组中的虚假值  arr.filter(Boolean)
                                    }) : ''
                                }
                            })
                            // 折扣
                        this.promotionList.forEach(item => {
                            if (this.allPrice >= item.price) {
                                let finallyDiscount = item.offPrice
                                if (this.discount < finallyDiscount) this.discount = finallyDiscount
                            }
                        })
                    }
                }
            })
        </script>
    </body>
    
    </html>
    
    
    // style部分
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title></title>
        <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script>
        <style>
            /*样式*/
            .box {
                width: 80px;
                height: 40px;
                border: 1px solid black;
                text-align: center;
                line-height: 40px;
                border-radius: 5px;
                margin-right: 15px;
                background-color: white;
                outline: none;
            }
    
            .box1 {
                border: 1px dashed #ccc;
                color: #ccc;
            }
    
            .active {
                border: 1px solid red;
                color: red;
            }
    
            .row {
                display: flex;
            }
        </style>
    </head>
    

***axios发起delete请求无法正常传参的问题

axios.delete(’/api’, {data:{userId:1}} )

***table表格合并单元格

<tr v-for="(item, index) in currentList.list" :key="index">
    <td>{{ item.number }}</td>
    <td></td>
    <td>{{ item.currency }} {{ item.price * item.number }}</td>
    // 循环生成的tr  删除多余的td用v-if判断一下
    <td v-if="index < 1" :rowspan="currentList.list.length">取消</td>
    <td v-if="index < 1" :rowspan="currentList.list.length"></td>
</tr>

***根据faterId整理children格式的数组

const map = {}
this.list.forEach(item => {
    item.children = []
    map[item.id] = item
})
for (const item of this.list) {
    if (!item.fatherId) {
        目标数组.push({ ...item })
    } else {
        if (map[item.fatherId]) {
            map[item.fatherId].children.push({ ...item })
        }
    }
}

***数据库更新时间字段

UPDATE `运行报表` SET `采集时间` =  DATE_SUB(`采集时间`,INTERVAL 1 DAY);
UPDATE `运行报表` SET `采集时间` =  DATE_FORMAT(`采集时间`,'%Y-%m-%d %H:%i:%s');

***vue keep-alive注意

<!--配合动态组件使用时 必须有一个根节点-->
<KeepAlive>
	<div> 
		<component :is="view"></component>
	</div>
</KeepAlive>
0

评论区