采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
这样的函数如果写在use函数里面如何接收参数,获取传递的参数
@touchstart="handleTouchstart($event)"
老师帮忙解答一下
<template>
<div class="report">
<div class="report_header"><div class="report_header_back iconfont" @click="handleBackClick"></div>购物趋势图</div>
<div class="report_content">
<div class="report_content_title">购物统计报告</div>
<div class="report_content_index">
<span class="arrow-up">
<svg data-v-666af9e5="" aria-hidden="true" focusable="false" data-prefix="fas" data-icon="angle-up" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512" class="svg-inline--fa fa-angle-up fa-w-10"><path data-v-666af9e5="" fill="currentColor" d="M177 159.7l136 136c9.4 9.4 9.4 24.6 0 33.9l-22.6 22.6c-9.4 9.4-24.6 9.4-33.9 0L160 255.9l-96.4 96.4c-9.4 9.4-24.6 9.4-33.9 0L7 329.7c-9.4-9.4-9.4-24.6 0-33.9l136-136c9.4-9.5 24.6-9.5 34-.1z"></path></svg>
</span>
<span class="percentage">34<span>%</span></span>
<span class="text">+14,400</span>
</div>
<div class="report_content_chart" id="chart" />
<div class="report_content_circle">
<div
:class="['circle', selected === index ? 'active' : '']"
v-for="(item ,index) of circles"
:key="index"
@click="handleClickCircle(index)" />
</div>
<div class="report_content_bottom">购物趋势</div>
</div>
<div class="report_footer">
<div class="report_footer_content">
<div class="left">
<div class="left_title">购物额</div>
<div class="left_sub_title">累计购物额</div>
</div>
<div class="right">
<small>¥</small> 300,254.00
</div>
</div>
<div class="report_footer_progress">
<div class="progress_background">
<div class="progress_current" :style="{ width: `${progress * 100}%` }"></div>
</div>
</div>
<div class="report_footer_text">
<div>购物增长率</div>
<div>34%</div>
</div>
</div>
</div>
</template>
<script>
import { ref, onMounted, onUnmounted } from 'vue'
import { useRouter } from 'vue-router'
import * as Echarts from 'echarts'
const useChangeShowItem = (selected, getChart) => {
const handleClickCircle = (index) => {
selected.value = index
getChart()
}
const changeShowItem = (index) => {
handleClickCircle(index)
}
return { handleClickCircle, changeShowItem }
}
export default {
name: 'Report',
setup () {
const router = useRouter()
const circles = Array(3).fill('')
const selected = ref(0)
const timer = ref(null)
const progress = ref(0.35)
const getChart = () => {
// 获取数据源
const mockData = []
for (let iii = 0; iii < 10; iii++) {
mockData.push(Math.floor(Math.random() * 100 + 200))
}
// 获取Chart => DOM
const chartDOM = document.getElementById('chart')
// 初始化echarts对象
const Chart = Echarts.init(chartDOM)
// 生成渲染参数
const options = {
xAxis: {
type: 'category', // 坐标轴类型
show: false // 坐标轴显示
},
yAxis: {
min: 0, // 最小值
max: 350, // 最大值
show: false
},
series: [{
data: mockData,
type: 'line',
smooth: true, // 平滑
areaStyle: { // 区域颜色
color: 'rgba(75, 193, 252, .5)'
},
lineStyle: { // 线的颜色2
width: 3,
color: 'rgba(75, 193, 252, 1)'
},
itemStyle: { // 点样式
color: 'rgba(75, 193, 252, 1)'
},
symbolSize: 8 // 点大小
}],
grid: { // 设置负数可以扩张延伸
top: 0,
bottom: 0,
left: -30,
right: -30
},
tooltip: {
trigger: 'axis', // 如何触发
axisPointer: { // tooltip类型
type: 'cross',
label: {
backgroundColor: '#6a7985' // tooltip触发线背景颜色
}
}
}
}
// 渲染图表
Chart.setOption(options)
}
const { handleClickCircle, changeShowItem } = useChangeShowItem(selected, getChart)
onMounted(() => {
getChart()
timer.value = setInterval(() => {
changeShowItem(++selected.value > 2 ? 0 : selected.value)
}, 3000)
})
onUnmounted(() => {
if (timer.value) clearInterval(timer.value)
})
const handleBackClick = () => {
router.back()
}
return { handleBackClick, circles, selected, progress, handleClickCircle }
}
}
</script><div
class="icons__item"
:style="{ top: `${index <= 4 ? 36 : 111}px`, left: leftPosition(index) }"
v-for="(item, index) of homeIconsList"
:key="item.desc"
@touchstart="handleTouchstart($event)"
@touchmove="handleTouchMove($event, index)"
@touchend="handleTouchend($event, index)"
>
<img class="icons__item__img" :src="`http://www.dell-lee.com/imgs/vue3/${ item.imgName }.png`" />
<p class="icons__item__desc">{{ item.desc }}</p>
</div>
const useMethods = (homeIconsList, e) => {
const handleTouchstart = (e) => {
const element = e.targetTouches[0]
e.currentTarget.style.opacity = 0.5
client.x = element.clientX // 鼠标落点初始位置
client.y = element.clientY // 鼠标落点初始位置
client.left = element.target.getBoundingClientRect().left // getBoundingClientRect用于获取某个元素相对于视窗的位置集合。集合中有top, right, bottom, left等属性。
client.top = element.target.getBoundingClientRect().top
}
const handleTouchMove = (e, index) => {
const element = e.targetTouches[0]
// 当前鼠标落点加上元素自身左边距上边距
const left = element.clientX - 35
const top = element.clientY - 270
// 移动当前元素
e.currentTarget.style.left = `${left}px`
e.currentTarget.style.top = `${top}px`
}
const handleTouchend = (e, index) => {
const end = {
x: e.changedTouches[0].clientX,
y: e.changedTouches[0].clientY
}
e.currentTarget.style.opacity = 1
const width = document.getElementsByClassName('icons')[0].offsetWidth
const positionX = parseInt(end.x / width * 10)
let positionY = 1
if (index <= 4) {
if (end.y - client.y < 30) {
positionY = 1
} else {
positionY = 2
}
} else if (index > 4) {
if (end.y - client.y < 0) {
positionY = 1
} else {
positionY = 2
}
}
let position = 0
if (positionX <= 1) {
if (positionY === 1) {
position = 0
} else {
position = 5
}
} else if (positionX <= 3) {
if (positionY === 1) {
position = 1
} else {
position = 6
}
} else if (positionX <= 5) {
if (positionY === 1) {
position = 2
} else {
position = 7
}
} else if (positionX <= 7) {
if (positionY === 1) {
position = 3
} else {
position = 8
}
} else if (positionX <= 9) {
if (positionY === 1) {
position = 4
} else {
position = 9
}
}
const item = homeIconsList.value[index]
homeIconsList.value.splice(index, 1)
homeIconsList.value.splice(position, 0, item)
store.commit('changeHomeIconsList', homeIconsList.value)
}
return { handleTouchstart, handleTouchMove, handleTouchend }
}老师,应该如何拿到$event
<template>
<div
class="icons__item"
:style="{ top: `${index <= 4 ? 36 : 111}px`, left: leftPosition(index) }"
v-for="(item, index) of homeIconsList"
:key="item.desc"
@touchstart="handleTouchstart($event)"
@touchend="handleTouchend($event, index)"
>
<img class="icons__item__img" :src="`http://www.dell-lee.com/imgs/vue3/${ item.imgName }.png`" />
<p class="icons__item__desc">{{ item.desc }}</p>
</div>
</template>
<script>
import { reactive, toRefs } from 'vue'
import { useStore } from 'vuex'
export default {
name: 'User',
components: { Docker },
setup () {
const store = useStore()
const client = reactive({
x: 0,
y: 0
})
const { homeIconsList } = toRefs(store.state)
const { handleLogoutClick } = useLogoutEffect()
const handleTouchstart = (e) => {
const element = e.targetTouches[0]
client.x = element.clientX
client.y = element.clientY
}
return { handleLogoutClick, handleTouchstart }
}
}
</script>
<style scoped>
</style>
登录后可查看更多问答,登录/注册