uniapp组件scroll-view实现双联动。(demo)


<template>
    <view class="use_com">
        <text>uniapp ---- 组件</text>
        <view>1、 scroll-view</view>
        
        <scroll-view class="com_scroll_view" scroll-x="true">
            <view v-for="(item,index) in get_scroll_view_list" :key="index" class="com_content">
                <view>
                    <image :src="item.mainPic" mode="" class="com_image"></image>
                    <view class="com_text1">{{item.skuName}}</view>
                    <view class="com_text2">{{item.priceValue}}</view>
                    <view class="com_text3">{{item.originPrice}}</view>
                </view>
                <view>
                    <view class="com_text4">
                        {{item.companyName}}
                    </view>
                </view>
            </view>
        </scroll-view>
        
        <view>******************************</view>
        
        <view>1、 scroll-view 双联动案例 (类似于锚点,原理也还是锚点)利用 scroll-into-view</view>
        <!-- uniapp获取节点信息,根据节点信息调整写需求。 -->
        <view>
            <view class="left">
                <!--    :class="index == click_index ? 'life_title':''"
                        :class="{life_title:index == click_index}"        -->
                <view 
                v-for="(item,index) in left_list" 
                :key="index" @click="change_click_index(index)" 
                :class="{life_title:index == click_index}"
                >
                    {{item.title}}
                </view>
            </view>
                
            <view class="right">
                <scroll-view 
                scroll-y="true" 
                class="scroll_y" 
                :scroll-into-view="scroll_into_view" 
                scroll-with-animation="true"
                @scroll="scroll_detail"
                @scrolltolower="scroll_bottom"
                >
                    <view v-for="(item,index) in left_list" :key="index">
                        <view style="background: red;" :id="'id'+index" class="selectAll">{{item.title}}</view>
                        <view v-for="(ite,ind) in item.list" :key="ind">{{ite}}</view>
                    </view>
                </scroll-view>
            </view>
        </view>
    </view>
</template>

<script>
    export default {
        data() {
            return {
                get_scroll_view_list:[],
                left_list:[
                    { title:"手机",list:["iphone12","华为p40","vivo90","oppoy77","三星手机"] },
                    { title:"电脑",list:["Mac pro","联想yoga910","华硕911","联想811","三星电脑"] },
                    { title:"水果",list:["香蕉","苹果","西瓜","榴莲","山竹"] },
                    { title:"饮料",list:["coke可乐","脉动","红牛","冰糖雪梨","果汁"] },
                ],
                //切换class
                click_index:0,
                //id动态切换
                scroll_into_view:"",
                //节点top值
                top_list:[]
            }
        },
        onLoad: function(){
            this.get_scroll_view();
        },
        methods: {
            async get_scroll_view(){
                let res = await this.$uni_request({
                    body:{
                        defaultProvince: "370000",
                        firstCateCode: "",
                        oldCustFlag: "2",
                        requiredAmount: "3"
                    },
                    header:{
                        bizCode: "prom013"
                    }
                });
                this.get_scroll_view_list = res.data.body.result;
            },
            //切换
            change_click_index(index){
                this.click_index = index;
                //利用uniapp组件的配置信息。
                this.scroll_into_view = 'id'+index;
                //解决最后一个 ***来回*** 问题 (由于点击左侧导航,右侧锚点位置信息变化,此时滚动事件也随之滚动。)
                uni.setStorageSync("resolve","last");
                setTimeout(()=>{
                    uni.clearStorageSync("resolve")
                },400);
            },
            //滚动过程
            scroll_detail(options){
                //options  为滚动信息。  options.detail.scrollTop  值为相对于scroll-view。
                if(!uni.getStorageSync("resolve")){
                    this.get_node_details(options);
                };
            },
            //获取节点信息
            get_node_details(options){
                const query = uni.createSelectorQuery().in(this); //获得实力
                //获取多个节点方式
                query.selectAll(".selectAll").boundingClientRect(data=>{
                    console.log(data); //得到class类名为  selectAll的数组集合
                    this.top_list = data.map(item=>{
                        return Math.ceil(item.top);
                    });
                    this.async_detail_msg(options);
                }).exec();
            },
            async_detail_msg(options){
                //options  为滚动信息。  options.detail.scrollTop  值为相对于scroll-view。
                let top_page = options.detail.scrollTop + this.top_list[0];
                
                for(let i = 0;i < this.top_list.length; i++){
                    let node1 = this.top_list[i];
                    let node2 = this.top_list[i+1];
                    if(node2 && top_page >= node1 && top_page < node2){
                        this.click_index = i;
                        break;
                    }else if(node2 && top_page === node2){
                        this.click_index = i + 1;
                        break;
                    }
                }
            },
            //滚动到底部
            scroll_bottom(options){
                setTimeout(()=>{
                    this.click_index = 3;
                },100)
            },
            
        }
    }
</script>

<style lang="scss" scoped>
    .use_com{
        margin-bottom: 100px;
    }
    .com_scroll_view{
        white-space:nowrap;
        .com_content{
            display: inline-block;
             200px;
            padding: 0 10px;
            .com_image{
                 100%;
            }
            .com_text1,.com_text2,.com_text3,.com_text4{
                 100%;
                white-space: nowrap;
                overflow: hidden;
                text-overflow: ellipsis;
            }
            
        }
    }
    .left,.right{
        display: inline-block;
        border: 1px solid #4CD964;
        vertical-align: top;
        height: 160px;
    }
    .right{
        display: inline-block;
        border: 1px solid #4CD964;
    }
    .scroll_y{
        height: 100%;
    }
    .life_title{
        background: #DD524D;
    }
    
</style>

 

原文地址:https://www.cnblogs.com/swt-axios/p/13474706.html