• vue学习31~39(列表过滤+列表排序+vue检测data中的数据+收集表单数据+过滤器)


    1.14 列表过滤

    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>列表过滤title>
        <script type="text/javascript" src="../js/vue.js">script>
    head>
    <body>
        <div id="root">
            
            <h2>人员列表h2>
            <input type="text" placeholder="请输入名字" v-model="keyWord">
            <ul>
                <li v-for="(p, index) of filPersons" :key="index">
                    {{p.name}}-{{p.age}}-{{p.sex}}
                li>
            ul>
        div>
    body>
    
    <script type="text/javascript">
        Vue.config.productionTip = false;
    
        // 用watch实现
        new Vue({
            el: '#root',
            data: {
                keyWord: '',
                persons: [
                    {id: '001', name: '马冬梅', age: 18, sex: '女'},
                    {id: '002', name: '周冬雨', age: 19, sex: '女'},
                    {id: '003', name: '周杰伦', age: 20, sex: '男'},
                    {id: '004', name: '温兆伦', age: 21, sex: '男'},
                ],
                filPersons: []
            },
            watch: {
                 keyWord: {
                    immediate: true,
                    handler(val) {
                        this.filPersons = this.persons.filter((p) => {
                            return p.name.indexOf(val) !== -1;
                        }) 
                    }
                 }
            }
        })
    
        // 用computed实现
        new Vue({
            el: '#root',
            data: {
                keyWord: '',
                persons: [
                    {id: '001', name: '马冬梅', age: 18, sex: '女'},
                    {id: '002', name: '周冬雨', age: 19, sex: '女'},
                    {id: '003', name: '周杰伦', age: 20, sex: '男'},
                    {id: '004', name: '温兆伦', age: 21, sex: '男'},
                ],
            },
            computed: {
                filPersons() {
                    return this.persons.filter((p) => {
                        return p.name.indexOf(this.keyWord) !== -1;
                    })
                }
            }
        })
    script>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72

    1.15 列表排序

    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>列表过滤title>
        <script type="text/javascript" src="../js/vue.js">script>
    head>
    <body>
        <div id="root">
            
            <h2>人员列表h2>
            <input type="text" placeholder="请输入名字" v-model="keyWord">
            <button @click="sortType = 2">年龄升序button>
            <button @click="sortType = 1">年龄降序button>
            <button @click="sortType = 0">原顺序button>
            <ul>
                <li v-for="(p, index) of filPersons" :key="p.id`">
                    {{p.name}}-{{p.age}}-{{p.sex}}
                li>
            ul>
        div>
    body>
    
    <script type="text/javascript">
        Vue.config.productionTip = false;
    
        // 用computed实现
        new Vue({
            el: '#root',
            data: {
                keyWord: '',
                sortType: 0, // 0原顺序 1降序 2升序
                persons: [
                    {id: '001', name: '马冬梅', age: 30, sex: '女'},
                    {id: '002', name: '周冬雨', age: 25, sex: '女'},
                    {id: '003', name: '周杰伦', age: 20, sex: '男'},
                    {id: '004', name: '温兆伦', age: 21, sex: '男'},
                ],
            },
            computed: {
                filPersons() {
                    const arr = this.persons.filter((p) => {
                        return p.name.indexOf(this.keyWord) !== -1;
                    })
                    // 判断一下是否排序
                    if (this.sortType) {
                        arr.sort((p1, p2) => {
                            return this.sortType === 1 ? p2.age - p1.age : p1.age - p2.age;
                        })
                    }
                    return arr;
                }
            }
        })
    script>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    1.16 vue 监测data 中的 数据

    先来个案例引入一下:

    
    <div id="root">
        <h2>人员列表h2>
        <button @click="updateMei">更新马冬梅的信息button>
        <ul>
            <li v-for="(p,index) of persons" :key="p.id">
                {{p.name}}-{{p.age}}-{{p.sex}}
            li>
        ul> 
    div>
    
    <script type="text/javascript">
        Vue.config.productionTip = false
    
        const vm = new Vue({
            el:'#root',
            data:{
                persons:[
                    {id:'001',name:'马冬梅',age:30,sex:'女'},
                    {id:'002',name:'周冬雨',age:31,sex:'女'},
                    {id:'003',name:'周杰伦',age:18,sex:'男'},
                    {id:'004',name:'温兆伦',age:19,sex:'男'}
                ]
            },
            methods: {
                updateMei(){
                    // this.persons[0].name = '马老师' //奏效
                    // this.persons[0].age = 50 //奏效
                    // this.persons[0].sex = '男' //奏效
                    this.persons[0] = {id:'001',name:'马老师',age:50,sex:'男'} //不奏效
                    // this.persons.splice(0,1,{id:'001',name:'马老师',age:50,sex:'男'})
                }
            }
        }) 
    
    script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    点击更新马冬梅的信息,马冬梅的数据并没有发生改变。

    在这里插入图片描述

    我们来看看控制台:
    在这里插入图片描述

    控制台上的数据发生了改变,说明,这个更改的数据并没有被 Vue 监测到。

    所以我们来研究一下 Vue 监测的原理。

    我们先研究 Vue 如何监测 对象里的数据

    代码

    
    <div id="root">
        <h2>学校名称:{{name}}h2>
        <h2>学校地址:{{address}}h2>
    div>
    
    <script type="text/javascript">
        Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
    
        const vm = new Vue({
            el:'#root',
            data:{
                name: 'yaya',
                address: '北京',
                student:{
                    name:'tom',
                    age:{
                        rAge:40,
                        sAge:29,
                    },
                    friends:[
                        {name:'jerry',age:35}
                    ]
                }
            }
        })
    script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    在这里插入图片描述

    讲一下解析模板后面的操作—>调用 set 方法时,就会去解析模板----->生成新的虚拟 DOM----->新旧DOM 对比 -----> 更新页面

    模拟一下 vue 中的 数据监测

    <script type="text/javascript" >
    
        let data = {
            name:'尚硅谷',
            address:'北京',
        }
    
        //创建一个监视的实例对象,用于监视data中属性的变化
        const obs = new Observer(data)		
        console.log(obs)	
    
        //准备一个vm实例对象
        let vm = {}
        vm._data = data = obs
    
        function Observer(obj){
            //汇总对象中所有的属性形成一个数组
            const keys = Object.keys(obj)
            //遍历
            keys.forEach((k) => {
                Object.defineProperty(this, k, {
                    get() {
                        return obj[k]
                    },
                    set(val) {
                        console.log(`${k}被改了,我要去解析模板,生成虚拟DOM.....我要开始忙了`)
                        obj[k] = val
                    }
                })
            })
        }
    script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    在这里插入图片描述

    Vue.set 的使用

    Vue.set(target,propertyName/index,value) 或

    vm.$set(target,propertyName/index,value)

    用法

    响应式对象中添加一个 property,并确保这个新 property 同样是响应式的,且触发视图更新。它必须用于向响应式对象上添加新 property,因为 Vue 无法探测普通的新增 property (比如 vm.myObject.newProperty = 'hi')

    代码

    
    <div id="root">
        <h1>学生信息h1>
        <button @click="addSex">添加性别属性,默认值:男button> <br/>
    div>
    
    <script type="text/javascript">
        Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
    
        const vm = new Vue({
            el:'#root',
            data:{
                student:{
                    name:'tom',
                    age:18,
                    hobby:['抽烟','喝酒','烫头'],
                    friends:[
                        {name:'jerry',age:35},
                        {name:'tony',age:36}
                    ]
                }
            },
            methods: {
                addSex(){
                    // Vue.set(this.student,'sex','男')
                    this.$set(this.student,'sex','男')
                }
            }
        })
    script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    Vue.set() 或 vm.$set 有缺陷:

    注意对象不能是Vue实例,或者Vue实例的根数据对象,即 vm 和 _data

    看完了 vue 监测对象中的数据,再来看看 vue 如何监测 数组里的数据

    先写个代码案例

    
    <div id="root">
        <h2>爱好h2>
        <ul>
            <li v-for="(h,index) in student.hobby" :key="index">
                {{h}}
            li>
        ul>
        <h2>朋友们h2>
        <ul>
            <li v-for="(f,index) in student.friends" :key="index">
                {{f.name}}--{{f.age}}
            li>
        ul>
    div>
    
    <script type="text/javascript">
        Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
    
        const vm = new Vue({
            el:'#root',
            data:
                student:{
                    name:'tom',
                    age:{
                        rAge:40,
                        sAge:29,
                    },
                    hobby:['抽烟','喝酒','烫头'],
                    friends:[
                        {name:'jerry',age:35},
                        {name:'tony',age:36}
                    ]
                }
            },
        })
    script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    在这里插入图片描述

    所以我们通过 vm._data.student.hobby[0] = ‘aaa’ // 不奏效

    vue 监测在数组那没有 getter 和 setter,所以监测不到数据的更改,也不会引起页面的更新

    在这里插入图片描述

    既然 vue 在对数组无法通过 getter 和 setter 进行数据监视,那 vue 到底如何监视数组数据的变化呢?

    vue对数组的监测是通过 包装数组上常用的用于修改数组的方法来实现的。

    vue官网的解释:

    在这里插入图片描述

    总结:

    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>总结Vue数据监测title>
        <script type="text/javascript" src="../js/vue.js">script>
    head>
    <body>
        <div id="root">
            <h1>学生信息h1>
    
            <button @click="student.age++;">年龄+1岁button><br>
            <button @click="addSex">添加性比属性,默认值:男button><br>
            <button @click="student.sex='未知'">修改性别button><br>
            <button @click="addFriend">在列表首位添加一个朋友button><br>
            <button @click="updateFirstFriendName">修改第一个朋友的名字为:张三button><br>
            <button @click="addHobby">添加一个爱好button><br>
            <button @click="updateFirstHobby">修改第一个爱好为:开车button>
            <button @click="removeSmoke">过滤掉爱好中的抽烟button>
    
            <h3>姓名:{{student.name}}h3>
            <h3>年龄:{{student.age}}h3>
            <h3 v-if="student.sex">性别:{{student.sex}}h3>
            <h3>爱好h3>
            <ul>
                <li v-for="(h, index) in student.hobby" :key = "index">
                    {{h}}
                li>
            ul>
            <h2>朋友们h2>
            <ul>
                <li v-for="(f, index) in student.friends" :key = "index">
                    {{f.name}}--{{f.age}}
                li>
            ul>
        div>
    body>
    
    <script type="text/javascript">
        Vue.config.productionTip = false;
    
        const vm = new Vue({
            el: '#root',
            data: {
                student: {
                    name: 'tom',
                    age: 18,
                    hobby: ['抽烟', '喝酒', '烫头'],
                    friends: [
                        {name: 'jerry', age: 35},
                        {name: 'tony', age: 36},
                    ]
                }
            },
            methods: {
                addSex() {
                    // Vue.set(this.student, 'sex', '男');
                    this.$set(this.student, 'sex', '男');
                },
                addFriend() {
                    this.student.friends.unshift({name: 'jack', age: 70});
                },
                updateFirstFriendName() {
                    this.student.friends[0].name = '张三';
                    // this.student.friends[0].age = 5;
                },
                addHobby() {
                    this.student.hobby.push('学习');
                },
                updateFirstHobby() {
                    // this.student.hobby.splice(0, 1, '开车');
                    // Vue.set(this.student.hobby, 0, '开车');
                    this.$set(this.student.hobby, 0, '开车');
                },
                removeSmoke() {
                    this.student.hobby = this.student.hobby.filter((h) => {
                        return h !== '抽烟';
                    })
                }
            }
        })
    script>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85

    Vue监视数据的原理:

    • vue会监视data中所有层次的数据

    • 如何监测对象中的数据?

      通过setter实现监视,且要在new Vue时就传入要监测的数据。

      • 对象中后追加的属性,Vue默认不做响应式处理

      • 如需给后添加的属性做响应式,请使用如下API:

        Vue.set(target,propertyName/index,value) 或

        vm.$set(target,propertyName/index,value)

    • 如何监测数组中的数据?

      通过包裹数组更新元素的方法实现,本质就是做了两件事:

      • 调用原生对应的方法对数组进行更新
      • 重新解析模板,进而更新页面
    • 在Vue修改数组中的某个元素一定要用如下方法:

      • 使用这些API:push()、pop()、shift()、unshift()、splice()、sort()、reverse()
      • Vue.set() 或 vm.$set()

    特别注意:Vue.set() 和 vm.$set() 不能给vm 或 vm的根数据对象 添加属性!!!

    1.17 收集表单数据

    若:,则v-model收集的是value值,用户输入的就是value值。

    
    <div id="root">
        <form @submit.prevent="demo">
            账号:<input type="text" v-model.trim="userInfo.account"> <br/><br/>
            密码:<input type="password" v-model="userInfo.password"> <br/><br/>
            年龄:<input type="number" v-model.number="userInfo.age"> <br/><br/>
            <button>提交button>
        form>
    div>
    
    <script type="text/javascript">
        Vue.config.productionTip = false
    
        new Vue({
            el:'#root',
            data:{
                userInfo:{
                    account:'',
                    password:'',
                    age:18,
                }
            },
            methods: {
                demo(){
                    console.log(JSON.stringify(this.userInfo))
                }
            }
        })
    script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    若:,则v-model收集的是value值,且要给标签配置value值。

    
    <div id="root">
        <form @submit.prevent="demo">
            性别:
            男<input type="radio" name="sex" v-model="userInfo.sex" value="male"><input type="radio" name="sex" v-model="userInfo.sex" value="female">
        form>
    div>
    
    <script type="text/javascript">
        Vue.config.productionTip = false
    
        new Vue({
            el:'#root',
            data:{
                userInfo:{
                    sex:'female'
                }
            },
            methods: {
                demo(){
                    console.log(JSON.stringify(this.userInfo))
                }
            }
        })
    script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    若:

    • 没有配置input的value属性,那么收集的就是checked(勾选 or 未勾选,是布尔值)
    • 配置input的value属性:
      • v-model的初始值是非数组,那么收集的就是checked(勾选 or 未勾选,是布尔值)
      • v-model的初始值是数组,那么收集的的就是value组成的数组
    
    <div id="root">
        <form @submit.prevent="demo">
            爱好:
            学习<input type="checkbox" v-model="userInfo.hobby" value="study">
            打游戏<input type="checkbox" v-model="userInfo.hobby" value="game">
            吃饭<input type="checkbox" v-model="userInfo.hobby" value="eat">
            <br/><br/>
            所属校区
            <select v-model="userInfo.city">
                <option value="">请选择校区option>
                <option value="beijing">北京option>
                <option value="shanghai">上海option>
                <option value="shenzhen">深圳option>
                <option value="wuhan">武汉option>
            select>
            <br/><br/>
            其他信息:
            <textarea v-model.lazy="userInfo.other">textarea> <br/><br/>
            <input type="checkbox" v-model="userInfo.agree">阅读并接受<a href="http://www.atguigu.com">《用户协议》a>
            <button>提交button>
        form>
    div>
    
    <script type="text/javascript">
        Vue.config.productionTip = false
    
        new Vue({
            el:'#root',
            data:{
                userInfo:{
                    hobby:[],
                    city:'beijing',
                    other:'',
                    agree:''
                }
            },
            methods: {
                demo(){
                    console.log(JSON.stringify(this.userInfo))
                }
            }
        })
    script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    在这里插入图片描述

    备注:v-model的三个修饰符:

    lazy:失去焦点再收集数据

    number:输入字符串转为有效的数字

    trim:输入首尾空格过滤

    1.18 过滤器(非重点)

    定义:对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理)。

    语法:

    • 注册过滤器:Vue.filter(name,callback) 或 new Vue{filters:{}}
    • 使用过滤器:{{ xxx | 过滤器名}} 或 v-bind:属性 = “xxx | 过滤器名”
    
    <div id="root">
        <h2>显示格式化后的时间h2>
        
        <h3>现在是:{{ fmtTime }}h3>
        
        <h3>现在是:{{ getFmtTime() }}h3>
        
        <h3>现在是:{{time | timeFormater}}h3>
        
        <h3>现在是:{{time | timeFormater('YYYY_MM_DD') | mySlice}}h3>
        <h3 :x="msg | mySlice">尚硅谷h3>
    div>
    
    <script type="text/javascript">
        Vue.config.productionTip = false
        //全局过滤器
        Vue.filter('mySlice',function(value){
            return value.slice(0,4)
        })
    
        new Vue({
            el:'#root',
            data:{
                time:1621561377603, //时间戳
                msg:'你好,尚硅谷'
            },
            computed: {
                fmtTime(){
                    return dayjs(this.time).format('YYYY年MM月DD日 HH:mm:ss')
                }
            },
            methods: {
                getFmtTime(){
                    return dayjs(this.time).format('YYYY年MM月DD日 HH:mm:ss')
                }
            },
            //局部过滤器
            filters:{
                timeFormater(value, str='YYYY年MM月DD日 HH:mm:ss'){
                    // console.log('@',value)
                    return dayjs(value).format(str)
                }
            }
        })
    script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    备注:

    1.过滤器也可以接收额外参数、多个过滤器也可以串联

    2.并没有改变原本的数据, 是产生新的对应的数据

  • 相关阅读:
    MySQL常见面试题(三)
    【gitlab】git push -u origin master 报403
    一些国内镜像 快速源
    asp.net core mvc之 布局
    JZ47 礼物的最大价值
    主题聚类模型
    NDK20b FFmpeg4.2.2 编译和集成
    【目标检测】目标尺度和图像分辨率之间的关系
    从handle得到GraphicBuffer
    乐划锁屏插画大赏热度持续,进一步促进价值内容的创造与传播
  • 原文地址:https://blog.csdn.net/m0_57809042/article/details/128090294