vue案例QQ好友列表

功能如下:滚动条滚动,qq好友在线和不在线的区分,点击分组名展开列表,再点则合并,列表展开合并时具有简单的动画效果。

通过axios发送请求拿到数据,利用自定义属性进行传值给子组件,使用transition标签实现动画。具体代码如下:

css代码:

        *{
            margin: 0;
            padding: 0;
        }
        #app{
            width: 300px;
            height: 500px;
            margin: 20px auto;
            overflow-y: scroll;
            border: 1px solid rgb(226, 219, 219);
            background-color: rgba(104, 187, 104,0.5);
        }
        h1{
            text-align: center;
        }
        h2{
            display: flex;
            justify-content: space-between;
            padding: 10px 20px;
            background-color: lightgray;
        }
        ul{
            list-style: none;
            overflow: hidden;
        }
        li{
            border-bottom: 1px solid rgb(207, 196, 196);
            margin: 10px;
        }
        img{
            width: 40px;
            height: 40px;
            border-radius: 50%;
            float: left;
            margin-right: 10px;
        }
        p{
            text-overflow: ellipsis;
            overflow: hidden;
            white-space: nowrap;
        }
        .fade-enter,.fade-leave-to{
            max-height:0;
        }
        .fade-enter-active,.fade-leave-active{
            transition: all 1s;
        }
        .fade-enter-to,.fade-leave{
            max-height: 600px;
        }
        .rotate{
            transform: rotate(90deg);
        }
        span{
            transition: 0.5s;
        }
        .bu{
            filter: grayscale(100%);
            color: gray;
        }


    </style>

html和js代码:

<body>
    <div id="app">
        <h1>好友列表</h1>
        <group v-for="(item,i) in groups" :group-item="item" :key="i"></group>


    </div>
    
</body>
<script src="../vue.js"></script>
<script src="../axios.js"></script>
<script type="text/html" id="s1">
    <div>
        <h2 @click="open=!open">
            <span :class="open?'rotate':''">></span>
            <span >{{groupItem.groupName}}</span>
            <span>{{onlines}}/{{groupItem.list.length}}</span>
        </h2>
        <!-- 好友界面 -->
        <transition name="fade">
            <ul v-show="open">
                <li v-for="(f,i) in newList" :class="f.online?'zai':'bu'">
                    <img :src="f.src" alt="">
                    <h3 v-text="f.name"></h3>
                    <p>{{f.sign}}</p>
                </li>
            </ul>
        </transition>

    </div>

</script>
<script>
    Vue.component("group", {
        template:"#s1",
        data(){
            return{
                open:false 
            }
        },
        props:["groupItem"],
        computed:{
            onlines(){
                let count = 0
                this.groupItem.list.forEach(element=>{
                    if (element.online) {
                        count++
                    }
                })
                return count
            },
            newList(){
                let arr = []
                this.groupItem.list.forEach(e=>{
                    if (e.online) {
                        arr.unshift(e)
                    }else{
                        arr.push(e)
                    }
                })
                return arr
            }
        },
    })

    var app = new Vue({
        el:"#app",
        data:{
            groups:[]
        },
        created() {
            axios.get("./friendsData.json").then(res=>{
                this.groups = res.data
            })
        },

    })
</script>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作为AI助手,我需要先声明一下:WebRTC技术是一种实时通信的技术,用于浏览器之间的音视频通话、屏幕共享等场景。而Vue是一种前端框架,用于构建用户界面。 因此,WebRTC和Vue并不是一种直接相关的技术,但是可以通过Vue来构建WebRTC应用的用户界面。 下面是一个简单的WebRTC Vue案例: 1. 安装Vue和WebRTC相关的库 ``` npm install vue webrtc-adapter vue-webrtc ``` 2. 在Vue组件中引入WebRTC组件 ```html <template> <div> <video ref="localVideo" autoplay muted></video> <video ref="remoteVideo" autoplay></video> <button @click="startCall">Start Call</button> <button @click="endCall">End Call</button> </div> </template> <script> import VueWebRTC from 'vue-webrtc' export default { name: 'WebRTCComponent', components: { VueWebRTC }, data () { return { localStream: null, remoteStream: null, isCalling: false } }, methods: { async startCall () { this.isCalling = true this.localStream = await navigator.mediaDevices.getUserMedia({ audio: true, video: true }) this.$refs.localVideo.srcObject = this.localStream const rtcPeerConnection = new RTCPeerConnection({ iceServers: [ { urls: 'stun:stun.stunprotocol.org' } ] }) this.localStream.getTracks().forEach(track => rtcPeerConnection.addTrack(track, this.localStream)) rtcPeerConnection.addEventListener('icecandidate', event => { if (event.candidate) { // send ice candidate to remote peer } }) rtcPeerConnection.addEventListener('track', event => { this.remoteStream = event.streams[0] this.$refs.remoteVideo.srcObject = this.remoteStream }) // create offer and set local description const offer = await rtcPeerConnection.createOffer() await rtcPeerConnection.setLocalDescription(offer) // send offer to remote peer }, endCall () { // close peer connection and release stream resources this.isCalling = false this.localStream.getTracks().forEach(track => track.stop()) this.remoteStream.getTracks().forEach(track => track.stop()) const rtcPeerConnection = this.$refs.vueWebRTC.rtcPeerConnection if (rtcPeerConnection) { rtcPeerConnection.close() } } } } </script> ``` 3. 在Vue实例中使用WebRTC组件 ```js import Vue from 'vue' import WebRTCComponent from './WebRTCComponent.vue' new Vue({ el: '#app', components: { WebRTCComponent }, template: '<WebRTCComponent/>' }) ``` 在这个案例中,我们使用了vue-webrtc组件来简化WebRTC的使用。具体来说,我们在startCall方法中使用getUserMedia获取本地音视频流,创建RTCPeerConnection实例,并将本地流添加到peer connection中。然后,我们使用createOffer方法创建一个offer并将其设置为本地的SDP(Session Description Protocol)。最后,我们将offer发送给远程peer,并等待远程peer的answer。在answer到达之后,我们将其设置为远程SDP,并完成peer connection的建立。 需要注意的是,在实际应用中,我们需要处理各种事件,例如网络中断、peer connection失败等等。同时,我们还需要考虑如何安全地传输音视频流以及如何支持多人通话等场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值