Vue3.0

ONLYOFFICE集成(Vue3+Nest) 是一个开源办公套件,包括文本文档、电子表格、演示文稿和可填写表单的编辑器。它提供以下功能:创建、编辑和查看文本文档、电子表格、演示文稿和可填写表单。这里使用onlyoffice7.1.1版本(7.2版本默认开启jwt验证)集成 ONLYOFFICE Docs 到Vue.js项目。根据不同的状态执行不同的回调操作,必须返回以下响应,否则。 阅读详情

目录

 简介:

Vue3——使用vite构建对比图

1、传统构建

 2、vite构建

 3、构建vite步骤:

Vue3——Composition API

拉开序幕的setup:是所有Composition API(组合API)“表演舞台”

一、组件中所用刀的:数据、方法等等,均要配置在setup中。

二、setup函数的两种返回值:

三、注意:

Vue3——ref函数_处理基本类型

Vue3——ref处理对象类型

reactive函数

reactive方式:

reactive函数

 Vue3——回顾Vue2的响应式原理

Vue3的响应式原理

响应式原理——proxy

Vue3——响应式原理_Reflect

 Vue3——reactive对比ref

 Vue3的两个注意点:

Vue3——computed计算属性

Vue3——监视属性watch,监视ref数据 (可以传递三个参数)

情况五、监视reactive所定义的一个响应式数据中的某些属性

特殊情况:

 Vue3——WatchEffect函数

 Vue3——声明周期

 Vue3中可以继续使用Vue2中的生命周期钩子,但有两个更名:

 Vue3中也提供了Composi API形式的生命周期钩子,与Vue2中钩子对应关系如下:

Vue3中hook函数

Vue3——toRef与toRefs

toRef小结:

Vue3——shallowReactive与shallowRef

 Vue3——readonly与shallowReadonly

shallowReadonly,浅层次只读实例

Vue3——toRaw与markRaw

Vue3——customRef(自定义ref)

Vue3——provide(提供)与inject(注入)

 Vue3——响应式数据判断

Vue3——组合式API优势

 Vue3——Fragment组件

Vue3——Teleport组件

Child组件

Vue3——其他改变 


 简介:

Vue3——使用vite构建对比图

优势:

1、传统构建

 2、vite构建

 3、构建vite步骤:

Vue3——Composition API

拉开序幕的setup:是所有Composition API(组合API)“表演舞台”

一、组件中所用刀的:数据、方法等等,均要配置在setup中。

二、setup函数的两种返回值:

        (1)若返回一个对象,对象中的属性、方法,在模板中都可以直接使用。

        (2)若返回一个函数,则可以指定以渲染内容。

三、注意:

        1、尽量不要与vue2配置混用。

                (1)vue2配置(data,methods,computed)等都可以访问vue3中setup中的属性,方法。

                (2)但在setup中不能访问vue2的配置。

                (3)如果有重名,setup优先

        2、setup不能是一个async函数,因为返回值不再是return的对象,而是promise,模板看不到return对象中的属性和方法。 

Vue3——ref函数_处理基本类型

<template>
    <h1>ref函数的基本处理</h1>
    <h2>姓名:{{name}}</h2>
    <h2>年龄:{{age}}</h2>
    <button @click="changeInfo">修改人的信息<button>
</template>
<script>
    import {ref} from 'vue'
    export default{
        name:'App',
        setup(){
                //数据
            let name=ref("张三")
            let age=ref(18)
                //方法
            function changeInfo(){
                name.value="李四"
                age.value="25"
            }
            //返回一个对象
            return {
                name,
                age,
                changeInfo
            }
        }
}
</script>
<style></style>

Vue3——ref处理对象类型

<template>
    <h1>ref函数的基本处理</h1>
    <h2>姓名:{{name}}</h2>
    <h2>年龄:{{age}}</h2>
    <h3>薪资:{{salary}}</h3>
    <h3>职位:{{type}}</h3>
    <button @click="changeInfo">修改人的信息<button>
</template>
<script>
    import {ref} from 'vue'
    export default{
        name:'App',
        setup(){
                //数据
            let name=ref("张三")
            let age=ref(18)
            let job=ref{
                type:'前端实习生',
                salary:'4k'
            }
                //方法
            function changeInfo(){
                name.value="李四"
                age.value="25"
                job.value.type="前端开发工程师",
                job.value.salary:'10k'
            }
            //返回一个对象
            return {
                name,
                age,
                changeInfo
            }
        }
}
</script>
<style></style>

小结:

ref函数作用:

定义一个响应式数据。

语法:const  xxx = ref(initValue)

        (1)创建一个包含响应式数据的引用对象,简称ref对象。

     (2)JS中操作数据:xxx.value

     (3)模板中读取数据,不需要.value,直接<div>{{xxx}}</div>

备注:

        (1)接收的数据可以使:基本类型,也可以是对象类型。

        (2)基本类型的数据:响应式依然靠的是Object.defineProperty()的get与set完成的。

        (3)对象类型的数据:内部“使用”了Vue3中的一个函数——reactive函数。

reactive函数

 ref方式定义数据与reactive方式定义数据的对比

<template>
    <h1>ref函数的基本处理</h1>
    <h2>姓名:{{name}}</h2>
    <h2>年龄:{{age}}</h2>
    <h3>薪资:{{salary}}</h3>
    <h3>职位:{{type}}</h3>
    <button @click="changeInfo">修改人的信息<button>
</template>
<script>
    import {ref} from 'vue'
    export default{
        name:'App',
        setup(){
                //数据
            let name=ref("张三")
            let age=ref(18)
            let job=reactive{
                type:'前端实习生',
                salary:'4k'
            }
                //方法
            function changeInfo(){
        //ref方法
                name.value="李四"
                age.value="25"
-------------------------------------------------
       //reactive方法
                job.type="前端开发工程师",
                job.salary:'10k'
            }
            //返回一个对象
            return {
                name,
                age,
                changeInfo
            }
        }
}
</script>
<style></style>

reactive方式:

<template>
    <h1>ref函数的基本处理</h1>
    <h2>姓名:{{person.name}}</h2>
    <h2>年龄:{{person.age}}</h2>
    <h3>薪资:{{person.salary}}</h3>
    <h3>职位:{{person.type}}</h3>
    <button @click="changeInfo">修改人的信息<button>
</template>
<script>
    import {ref,reactive} from 'vue'
    export default{
        name:'App',
        setup(){
        age:18,
        job:{
            type:'前端工程师',
            salary:'10k',
        }
                //方法
        function changeInfo(){
             person.name="李四"
             person.age="25"
             person.job.type="前端开发工程师",
             person.job.salary:'10k'
         }
            //返回一个对象
        return {
             name,
             age,
             changeInfo
            }
        }
    }
}
</script>
<style></style>

reactive函数

1、作用:定义一个对象类型的相应数据(基本类型不要用它,要用ref函数);

2、语法:const 代理对象 = reactive(源对象)接收一个对象(或数组),返回一个代理对象(proxy的实例对象,简称proxy对象)对象;

3、reactive定义的响应式数据是“深层次的”;

4、内部基于ES6的Proxy实现,通过代理对象的操作源对象内部数据进行操作。

 Vue3——回顾Vue2的响应式原理

<template>
    <div>
        <h1>vue2响应式效果</h1>
        <h2>姓名:{{name}}</h2>
        <h2>年龄:{{age}}</h2>
        <button @click="addsex">添加一个sex属性</button>
        <button @click="deleteName">删除name属性</button>
    </div>
</template>
<script>
    import Vue from 'vue' //第二种方法
    export default{
        name:'App',
        data(){
            return{
                person:{
                    name:'张三',
                    age:18,
                    hobby:['学习','敲代码']
                }
            }
        },
        methods:{
            addSex(){
                this.$set(this.person,'性别','女')
                -------------------------------
                vue.set(this.person,'性别','女')
            },
            deleteName(){
                this.$delete(this.person,'性别','女')
                -----------------------------------------
                vue.delete(this.person,'性别','女')
            },
            updateHobby(){
                this.$set(this.person.hobby,1,'学习前端')  //把爱好数组索引1的修改
               -------------------------
                this.person.hobby.splice(0,1,'看书')  //修改第0个                
             }
        }
    }
</script>
<style></style>

Vue3的响应式原理

<template>
    <div>
        <h1>vue2响应式效果</h1>
        <h2 v-show="person.name">姓名:{{person.name}}</h2>
        <h2>年龄:{{person.age}}</h2>
        <h2 v-show="person.sex">性别:{{person.sex}}</h2>
        <button @click="addsex">添加一个sex属性</button>
        <button @click="deleteName">删除name属性</button>
    </div>
</template>
<script>
    import Vue from 'vue' //第二种方法
    export default{
        name:'App',
        setup(){
        let person = reactive({
            name:'',
            age:18,
           }),
        job:{
            type:'前端工程师',
            salary:'10k',
        },
                //方法
        function changeInfo(){
             person.name="李四"
             person.age="25"
             person.job.type="前端开发工程师",
             person.job.salary:'10k'
         },
        function addSex(){
            person.sex='男'
        },
        function deleteName(){
            delete.person.name
        }

            //返回一个对象
        return {
             name,
             addSex,
             deleteName,
             changeInfo
            }
        }     
    }
</script>
<style></style>

响应式原理——proxy

<head></head>
<body>
    <script>
        let person = {
            name:'张三',
            age:18
        } 
        const p = new Proxy(person,{
            get(target,propName){
                console.log(`有人读取了p身上的属性 ${propName}`)
                return target[propName]
            },
            set(target,propNmae,value){
                console.log(`有人修改,增加时,p身上的属性 ${propName}`)
                target[propName]=value
            },
            deleteProperty(target,propName){
               console.log(`有人删除了p身上的属性 ${propName}`)
               return delete target[propName]
            }
        })
        
    </script>
</body>

Vue3——响应式原理_Reflect

try....catch....方式判断代码执行

Object.defineProperty()

<head></head>
<body>
    <script>
        let person = {
            name:'张三',
            age:18
        },
        let obj={a:1,b:2} 
        try{
            Object.defineProperty(obj,'c',{
                get(){
                    return 3
                }
            })
            Object.defineProperty(obj,'c',{
                get(){
                    return 5
                }
            })
        }
        catch(error){
           console.log(error)
        }
    </script>
</body>

Reflect方式二:Reflect.defineProperty(),反射对象

<head></head>
<body>
    <script>
        let person = {
            name:'张三',
            age:18
        },
        let obj={a:1,b:2} 
        const x1 = Reflect.defineProperty(obj,'c',{
            get(){
                return 3
            }
        })
        const x2 = Reflect.defineProperty(obj,'c',{
            get(){
                return 5
            }
        })
        
    </script>
</body>

示例:

<head></head>
<body>
    <script>
        let person = {
            name:'张三',
            age:18
        },
        const p = new Proxy(person,{     //创建代理对象
            get(target,propName){
                
                return Reflect.get(target,propName)     //返回反射对象
            },
            set(target,propName,value){
                Reflect.set(target,propName,value)
            },
            deleteProperty(target,propName){
                return Reflect.deleteProperty(target,propName)
            }
        })
   
    </script>
</body>

 Vue3——reactive对比ref

 Vue3的两个注意点:

 

Vue3——computed计算属性

<template>
    姓:<input type='text' v-model="person.firstName">
    名:<input type='text' v-model="person.lastName">
    <span>全名:{{person.fullName}}</span>
    全名:<input type="text" v-model="person.fullName">
</template>
<script>
    import {reactive,computed} from 'vue'
    export default{
        name:'',
        setup(){
            let person = reactive({
                firstName:'张',
                lastName:'三'
            }),
//计算属性的简写形式(没有考虑计算属性被修改的情况)
            person.fullName=computed(()=>{
                return person.fristName +'-'+ person.lastName
            }),

//----------------------------------------
//计算属性的完整写法(考虑读写)
            person.fullName=computed({
                get(){
                    return person.firstName+'-'+person.lastName
                },
                set(value){
                    const nameArr = value.split('-')
                    person.firstName=nameArr[0]
                    person.lastName=nameArr[1]  
                ]
            })
        }
    }
</script>
<style></style>

Vue3——监视属性watch,监视ref数据 (可以传递三个参数)

    情况一、监视ref所定义的一个响应式

可以获取oldValue,可以开启deep

<template>
    <h2>当前信息为:{{msg}}</h2>
    <button @click="msg+='!'">修改信息</button>
</template>
<script>
    import {ref,watch} from 'vue'
    export default{
        name:'Demo',
        setup(){
            let sum = ref(0)
            let msg = ref('你好啊')
            watch(sum,,(newValue,oldValue)=>{
                console.log('sum或者msg的值变化了',newValue,oldValue)
            },{immediate:true})
            
        }
    }
</script>
<style></style>

    情况二、监视ref所定义的多个响应式

<template>
    <h2>当前值为:{{sum}}</h2>
    <h2>当前信息为:{{msg}}</h2>
    <button @click="sum++">点击加1</button>
    <button @click="msg+='!'">修改信息</button>
</template>
<script>
    import {ref,watch} from 'vue'
    export default{
        name:'Demo',
        setup(){
            let sum = ref(0)
            let msg = ref('你好啊')
            watch([sum,msg],(newValue,oldValue)=>{
                console.log('sum或者msg的值变化了',newValue,oldValue)
            },{immediate:true})
            
        }
    }
</script>
<style></style>

情况二、监视ref所定义的多个响应式数据

可以获取oldValue,可以开启deep

<template>
    <h2>当前和是:{{sum}}</h2>
    <button @click="sum++">点击+1</button>

    <h2>当前信息为:{{msg}}</h2>
    <button @click="msg+='!'">修改信息</button>
</template>
<script>
    import {ref,watch} from 'vue'
    export default{
        name:'Demo',
        setup(){
            let sum = ref(0)
            let msg = ref('你好啊')
            watch([sum,msg],(newValue,oldValue)=>{
                console.log('sum或者msg的值变化了',newValue,oldValue)
            },{immediate:true})
            
        }
    }
</script>
<style></style>

情况三、监视reactive所定义的一个响应式数据

监视属性watch时,value的问题:

1、监视的是一个简单类型时,不能加“value”属性;

2、监视的不是一个对象属性时:

处理方式一:“对象名.value” 此时相当于在对象里使用reactive处理了数据。

处理方式二:开启deep:true

        注:此处无法正确获取oldValue

<template>
    <h2>姓名:{{person.name}}</h2>
    <h2>年龄{{person.sum}}</h2>
    <h2>薪资{{person.job.j1.salary}}</h2>
    <button @click="person.age++">增长年龄</button>
    <button @click="person.job.j1.salary++">涨薪</button>
</template>
<script>
    import {reactive,watch} from 'vue'
    export default{
        name:'Demo',
        setup(){
            let person = reactive({
                name:'张三',
                age:18,
                job:{
                   j1:{
                        salary:20
                    }
                }
            })
            watch(person,(newValue,oldValue)=>{   /监视的是reactive直接创建的属性
                console.log('person变化了',newValue,oldValue)   /old属性没法获取
            },{deep:true}),
            return {
                name,
                sum,
                person
            }
        }
    }
</script>
<style></style>

情况四、监视reactive所定义的一个响应式数据中的某个属性,

oldValue同样无效

强制开启了深度监视

<template>
    <h2>姓名:{{person.name}}</h2>
    <h2>年龄{{person.sum}}</h2>
    <h2>薪资{{person.job.j1.salary}}</h2>
    <button @click="person.age++">增长年龄</button>
    <button @click="person.job.j1.salary++">涨薪</button>
</template>
<script>
    import {reactive,watch} from 'vue'
    export default{
        setup(){
            let person = reactive({
                name:'张三',
                age:18,
                job:{
                   j1:{
                        salary:20
                    }
                }
            })
            watch(()=>person.age,(newValue,oldValue)=>{
                console.log('person变化了',newValue,oldValue)
            }),
            return {
                name,
                sum,
                person
            }
        }
    }
</script>
<style></style>

情况五、监视reactive所定义的一个响应式数据中的某些属性

oldValue同样无效

强制开启了深度监视

<template>
    <h2>姓名:{{person.name}}</h2>
    <h2>年龄{{person.sum}}</h2>
    <h2>薪资{{person.job.j1.salary}}</h2>
    <button @click="person.age++">增长年龄</button>
    <button @click="person.job.j1.salary++">涨薪</button>
</template>
<script>
    import {reactive,watch} from 'vue'
    export default{
        setup(){
            let person = reactive({
                name:'张三',
                age:18,
                job:{
                   j1:{
                        salary:20
                    }
                }
            })
            watch([()=>person.name,()=>person.age],(newValue,oldValue)=>{
                console.log('person变化了',newValue,oldValue)
            }),
            return {
                name,
                sum,
                person
            }
        }
    }
</script>
<style></style>

特殊情况:

由于此处监视的是reactive定义的对象中的某个属性,且此属性任然是一个对象,

所以deep有效,

无法读取oldValue

<template>
    <h2>姓名:{{person.name}}</h2>
    <h2>年龄{{person.sum}}</h2>
    <h2>薪资{{person.job.j1.salary}}</h2>
    <button @click="person.age++">增长年龄</button>
    <button @click="person.job.j1.salary++">涨薪</button>
</template>
<script>
    import {reactive,watch} from 'vue'
    export default{
        setup(){
            let person = reactive({
                name:'张三',
                age:18,
                job:{
                   j1:{
                        salary:20
                    }
                }
            })
            watch(()=>person.job,(newValue,oldValue)=>{
                console.log('person变化了',newValue,oldValue)
            },{deep:true})   此时deep属性生效
            return {
                name,
                sum,
                person
            }
        }
    }
</script>
<style></style>

 Vue3——WatchEffect函数

 Vue3——声明周期

 

 Vue3中可以继续使用Vue2中的生命周期钩子,但有两个更名:

 Vue3中也提供了Composi API形式的生命周期钩子,与Vue2中钩子对应关系如下:

Vue3中hook函数

本质:是一个函数,把setup函数使用Composition API进行了封装。

类似于Vue2中的mixin函数

优势:复用代码,让setup中的逻辑更清楚易懂。

(不使用hook函数)

<template>
    <h2>当前和为:{{sum}}</h2>
    <button @click="sum++">点击+1</button>
    <hr>
    <h2>当前点击鼠标位置:x:{{point.x}}  y:{{point.y}}</h2>
</template>
<script>
    import {ref,reactive,onMounted} from 'vue'
    export default{
        name:'Demo',
        setup(){
            let sum = ref(0)
            let point = reactive({
                x:0,
                y:0
            })
            function savePoint(event){
                    point.x=event.pageX,
                    point.y=event.pageY
            onMounted(()=>{
                window.addEventListener('click',savePoint}
            })
            onBeforeUnmount(()=>{
                window.removeEventListener('click',savePoint)
            })
            return{sum,point}
        }
    }
</script>

(使用hook函数)

创建hook文件夹,创建.js文件

    import {reactive,onMounted,onBeforeUnmount} from 'vue'
    export default function(){
数据
      let point = reactive({
            x:0,
            y:0
      })
方法
      function savePoint(event){
         point.x=event.pageX,
         point.y=event.pageY
      }
生命周期钩子
         onMounted(()=>{
         window.addEventListener('click',savePoint}
          })
         onBeforeUnmount(()=>{
         window.removeEventListener('click',savePoint)
          })
    return point
}

组件中引用:

<template>
    <h2>当前和为:{{sum}}</h2>
    <button @click="sum++">点击+1</button>
    <hr>
    <h2>当前点击鼠标位置:x:{{point.x}}  y:{{point.y}}</h2>
</template>
<script>
    import {ref} from 'vue'
    import usePoint from '../hooks/usePoint'
    export default{
        name:'Demo',
        setup(){
            let sum = ref(0)
            let point = usePoint()
            return{sum,point}
        }
    }
</script>

Vue3——toRef与toRefs

toRef实例:


    <template>
        <h3>{{person}}</h3>
        <h3>姓名{{name}}</h3>
        <h3>年龄:{{age}}</h3>
        <h3>薪资:{{salary}}</h3>
        <button @click="name+='~'">点击修改姓名</button>
        <button @click="age++">点击增长年龄</button>
        <button @click="job.j1.salary++">涨薪</button>
    <template>
    <script>
        import {reactive,toRef} from 'vue'
        setup(){
            let person=reactive({
                name:'张三',
                age:18,
                job:{
                    j1:{
                        salary:20
                    }
                }
            })
            return {
                name:toRef(person,'name')
                age:toRef(person,'age')
                salary:toRef(person.job.j1,'salary')
            }
        }
  
    </script>

toRefs实例:


    <template>
        <h3>{{person}}</h3>
        <h3>姓名{{name}}</h3>
        <h3>年龄:{{age}}</h3>
        <h3>薪资:{{salary}}</h3>
        <button @click="name+='~'">点击修改姓名</button>
        <button @click="age++">点击增长年龄</button>
        <button @click="job.j1.salary++">涨薪</button>
    <template>
    <script>
        import {ref,reactive,toRef,torefs} from 'vue'
        setup(){
            let person=shallowReactive({
                name:'张三',
                age:18,
                job:{
                    j1:{
                        salary:20
                    }
                }
            })
            return {
                person,
                ...toRefs(person)
            }
        }
    </script>

toRef小结:

作用:创建一个ref对象,其value值指向另一个对象中的某个属性;

语法:const name = toRef(person,'name'),

应用:要将响应式对象中的某个属性单独提供给外部使用时。

扩展:toRefs与toRef功能一致,但可以批量创建多个ref对象,语法:toRefs(person)

Vue3——shallowReactive与shallowRef

shallowReactive实例:


    <template>
        <h3>当前x.y的值是{{x.y}}</h3>
        <button @click="x={y:888}">点我y会替换</button>
        <button @click="x.y++">点击y并不会加</button>
    <template>
    <script>
        import {shallowReactive} from 'vue'
        export default{
        name:'Demo',
        setup(){
            let x = shallowRef({
                y:0
            })
            console.log("******",x)
            return {
                x
            }
        }
    }
    </script>

shallowRef实例:


    <template>
        <h3>当前x.y的值是{{x.y}}</h3>
        <button @click="x={y:888}">点我y会替换</button>
        <button @click="x.y++">点击y并不会加</button>
    <template>
    <script>
        import {shallowRef} from 'vue'
        export default{
            name:'Demo',
            setup(){
                let x = shallowRef({
                y:0
            })
            console.log("******",x)
            return {
                x
            }
        }
        }
  
    </script>

 Vue3——readonly与shallowReadonly

readonly只读属性


    <template>
        <h3>{{person}}</h3>
        <h3>姓名{{name}}</h3>
        <h3>年龄:{{age}}</h3>
        <h3>薪资:{{salary}}</h3>
        <button @click="name+='~'">点击修改姓名</button>
        <button @click="age++">点击增长年龄</button>
        <button @click="job.j1.salary++">涨薪</button>
    <template>
    <script>
        import {ref,reactive,toRef,torefs,radyonly} from 'vue'
        export default{
            name:'Demo',
            setup(){
                let sum = ref()
                let person = reactive({
                    name:'张三',
                    age:18,
                    job:{
                        j1:{
                            salary:20
                        }
                    }
                })
                person = readonly(person)
                return {
                    sum,
                    ...toRefs(person)
                }
            }
        }
    </script>

shallowReadonly,浅层次只读实例


    <template>
        <h3>{{person}}</h3>
        <h3>姓名{{name}}</h3>
        <h3>年龄:{{age}}</h3>
        <h3>薪资:{{salary}}</h3>
        <button @click="name+='~'">点击修改姓名</button>
        <button @click="age++">点击增长年龄</button>
        <button @click="job.j1.salary++">涨薪</button>
    <template>
    <script>
        import {ref,reactive,toRef,toRefs,shallReadonly} from 'vue'
        export default{
            name:'Demo',
            setup(){
                let sum = ref()
                let person = reactive({
                    name:'张三',
                    age:18,
                    job:{
                        j1:{
                            salary:20
                        }
                    }
                })
                person = shallReadonly(person)
                return {
                    sum,
                    ...toRefs(person)
                }
            }
        }
    </script>

Vue3——toRaw与markRaw

Vue3——customRef(自定义ref)

 作用:创建一个自定义ref,并对其依赖项跟踪和更新触发进行显式控制。

<template>
    <input type = "text" v-model="keyWord">
    <h3>{{keyword}}</h3>
</template>
<script>
    import {ref,customRef,} from 'vue'
    export default{
        name:'App',
        setup(){
            function myRef(value,delay){   //定义一个自定义函数,接收keyword参数与延迟时间

                let timer  //定义一个全局定时器

                return customRef((value,trigger)=>{ //返回一个自定义ref,并接收参数

                    return{
                        get(){  //获取,读取数据

                            console.log("有人读取数据了,${{value}}"

                            track()   //告诉Vue这个value需要跟踪
                            return value
                        }, 
                        set(newValue){   //设置值

                            console.log("有人修改了数据")
                            clearTimeout(timer)   //每次设置值之前清楚定时器

                            timer=setTimeout(()=>{    //创建一个定时器

                                value=newValue   //接收修改的值并重新传给value

                                trigger()   //通知vue重新解析模板
                            },delay)
                        }
                    }
                })
            }  
         let keyWord = myRef('hello',500) //设置延迟的时间,并传给函数中
         return {keyWord}
        }
    }
</script>
<style></style>

Vue3——provide(提供)与inject(注入)

祖父组件:

<template>
    <div>
        <h3>我是App组件,{{name}}--{{price}}</h3>
        <Child/>
    </div>
</template>
<script>
    import {reactive,toRefs} from 'vue'
    import Child from './Child'
    export default{
        name:'',
        components:[Child],
        setup(){
            let car = reactive({name:'问界',price:'30w'})
            provide('carValue',car)  //通过provide给Son组件注入数据,数据名为carValue
            return {...toRefs(car)}
        }
    }
</script>
<style></style>

父组件:

<template>
    <div class="child">
        <h3>我是Child组件(子)</h3>
        <Son/>
    </div>
</template>
<script>
    import Son from './Son'
    export default{
        name:'Child',
        components:{Son},
    }
</script>
<style></style>

子组件:

<template>
    <div>
        <h3>我是Son组件,{{car.name}--{{car.price}}}</h3>
    </div>
</template>
<script>
    import {inject} from 'vue'
    export default{
        name:'Son',
        setup(){
            let car = inject('carValue') //接收从祖父组件传过来的值
            return {car}
        }
    }
</script>
<style></style>

小结:

 Vue3——响应式数据判断

 

 

 返回值都是true

Vue3——组合式API优势

 Vue3——Fragment组件

Vue3——Teleport组件

<template>
    <div>
        <button @click="isShow=true">点击弹窗</button>
        <teleport to="body">
            <div v-if="isShow" class="mask">  //遮罩层
                <div class="dialog">
                    <h2>我是一个弹窗</h2>
                    <h3>一些内容</h3>
                    <h3>一些内容</h3>
                    <button @click="isShow = false">关闭弹窗</button>
                </div>
            </div>
        </teleport>
    </div>
</template>
<script>
    import {ref} from 'vue',
    export default{
        name:'Dialog',
        setup(){
            let isShow=ref(false)
            return {isShow}
        }
    }
</script>
<style></style>

Vue3——Suspense组件

<template>
    <div class="app">
        <h3>我是App组件</h3>
        <Suspense>  、、使用Suspense包裹组件,并配置好default与fallback
            <template v-slot:default>  //固定写法,这个插槽中放入的是放入的组件
                <Child/>
            </template>
            <template v-slot:fallback>  //这个组件中放提示信息
                <h3>正在加载中</h3>
            </template>
        </Supense>
    </div>
</template>
<script>
    import {defineAsyncComponent} from 'vue'   导入异步组件
    const Child = defineAsyncComponent(()=>import('./components/Child'))
    export default{
        name:'App',
        components:{Child}
    }
</script>
<style></style>

Child组件

<template>
    <div class="child">
        <h3>我是child组件</h3>
        {{sum}}
    </div>
</template>
<script>
    import {ref} from 'vue'
    export default{
        name:'Child',
        saync setup(){
            let sum = ref(0)
            let p = new Promise((resolve,reject)=>{
                setTimeout(()=>{
                    resolve({sum})
                },3000)
            })
            return await p
        }
    }
</script>
<style></style>

 setup不能是一个async函数,因为返回值不再是return 对象,而是promise,模板看不到return对象中的属性,但是后期可以返回一个promise实例,需要异步组件()和Suspense配合。

Vue3——其他改变 

 

 

 

 

onlyoffice 修改/etc/onlyoffice/documentserver/default.json 中rejectUnauthorized的值为false。Podman是RedHat开发的一个用户友好的容器调度器,是一种开源的Linux原生工具,是RedHat 8和CentOS 8中默认的容器引擎。将域名证书相关文件上传到/app/onlyoffice/CommunityServer/data/certs/中。(1)springboot 提供读取minio中存储的文件接口和onlyoffice回调接口。 阅读详情

相关推荐

【vue2+onlyoffice】基础预览demo运行+问题解决

ONLYOFFICE,是一个包含常用办公套件,Word 、Excel、PPT大办公套件搬到了云端,只需要一个浏览器即可以在线使用 Office 的各种功能。特色:可以用于文档处理、协作编辑、项目管理和文档预览等多种用途。版本对比:开源版(Community Edition):免费提供,适用于个人用户和小型团队。包含基本的文档处理、协作编辑和项目管理功能。支持跨平台运行和多人协作编辑。

记录 1万+

onlyOffice+vue实现基础案例

onlyOffice+vue实现基础案例

weixin_45717984的博客 1万+

VUE3.0学习系列随笔(一):VUE3.0项目初始化

VUE3.0学习系列随笔(一):VUE3.0项目初始化 1、VUE3.0简介 VUE3.0相对于VUE2.0的提升主要有以下几点: Performance:性能更比Vue 2.0强。 Tree shaking support:可以将无用模块“剪辑”,仅打包需要的。 Composition API:组合API Fragment, Teleport, Suspense:“碎片”,Teleport即Protal传送门,“悬念” Better TypeScript support:更优秀的Ts支持 Custom

一方通行的博客 1万+

Vue2/3集成OnlyOffice

docker部署这方面教程很多,我是直接在 docker desktop 中搜索 OnlyOffice 拉取就行,如下图。我的 editWord 组价是通过其他页面路由传入的文件路径实现的功能,注意中文名称的文件最好也做一下编码。这俩问题都是我在DeepSeek的辅助下解决的,如果有同样的问题一直解决不了的话真心推荐和ai沟通沟通。我是通过禁用 OnlyOffice 的 JWT 解决的,项目中有鉴权,也不太需要 OF 的拦截。在出现的界面中划到最底下,逐步复制并cmd运行官方这两条指令。

m0_46365672的博客 6417

vue3.0和vue2.0的区别详细讲解

vue经历从2.0到3.0更新之后,简⽽⾔之就是变得更轻更快,使⽤起来更加⽅便,下面这篇文章主要给大家介绍了关于vue3.0和vue2.0区别的相关资料,需要的朋友可以参考下Vue 3.0是一个用于构建用户界面的JavaScript框架。相比于Vue 2.x,Vue 3.0在性能、体积和开发体验上都有了很大的提升。

aaa123aaasqw的博客 2354

谈谈vue3.0和vue2.0的对比区别

在这个例子中,v-for 和 v-if 的顺序是固定的,所以 v-if 先于 v-for 执行,v-for 内部的每个循环项都会经过 v-if 的判断。实际上,在 Vue 3.0 的语法中,v-if 和 v-for 的优先级是没有差别的,也不存在 v-if 优先级高于 v-for 的说法。它们的优先级取决于它们的顺序,如果 v-if 在 v-for 之前,则 v-if 先于 v-for 执行,反之则相反。Vue 3.0 的语法规范中是不允许将 v-if 和 v-for 写在同一行的。

陪倩碎碎念的博客 1686

Vue2.0+Vue3.0全套教程丨vuejs从入门到精通之第2篇

Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue 都可以胜任。Vue2.0+Vue3.0全套教程丨vuejs从入门到精通。

只想AC的博客 2810

Vue3——从0到1的搭建过程

在Vue2里面,通过new Vue({})构造函数创建应用实例对象,而Vue3引入的不再是Vue的构造函数,引入的是一个名为createApp的工厂函数创建应用实例对象。既然是学习Vue3,那么首先应该需要的是如何初始化项目,在这里提供了两种方式供大家参考。props:值为对象,包含:组件外部传递过来,且组件内部声明接收了的属性。这里的项目目录结构分析主要是main.js文件。Vue2里面的main.js。Vue3里面的main.js。setup函数的两种返回值。setup的执行时机。

weixin_48636669的博客 1659

vue 3.0 正式版_Vuejs 3 Release:One Piece. Vuejs 3.0 正式版发布!代号:海贼王

Vuejs 3.0 在北京时间2020年9月19日凌晨,终于发布了 3.0 版本,代号:One Piece。此次vue3.0 为用户提供了全新的 composition-api 以及更小的包大小,和更好的 TypeScript 支持。Vue3.0发布链接​github.comVue 是当前非常流行的框架,Vue3.0更是酝酿了2年多的时间,经过2600多次commit,600多次PR,中间也发布了...

weixin_39830588的博客 433

大疆航线文件解析指南:5分钟搞懂KMZ里的template.kml和waylines.wpml区别

本文深入解析大疆无人机航线文件KMZ中template.kml与waylines.wpml的核心区别。template.kml是定义任务框架和全局参数的可编辑模板,而waylines.wpml是包含精确执行指令的最终文件。理解两者差异对于高效规划航线、批量生成任务及进行二次开发至关重要。

sun99的博客 864

【mip-NeRF】使用一组二维图像渲染3D场景视频(mip-NeRF论文复现)

本文对mip-NeRF模型的pytorch实现进行了复现

Ryan2k的博客 1841

Vue2.0+Vue3.0全套教程丨vuejs从入门到精通之第1篇

Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue 都可以胜任。Vue2.0+Vue3.0全套教程丨vuejs从入门到精通。

只想AC的博客 4780

软件测试 | 手把手教你如何使用 Charles 抓包工具(电脑+手机端)

软件测试 | 手把手教你如何使用 Charles 抓包工具(电脑+手机端)一、Charles简介二、Charles下载与安装三、Charles配置(1)Charles-PC端的配置如下:(2)过滤网络请求:(3)Charles抓取HTTPS请求包前置条件:(4)Charles抓取HTTPS双向认证包:关注我,免费领取学习资料 嘿。大家好,我是4U: 做过 APP 测试的同学都会接触抓包工具,通过抓包工具可以获取到客户端与服务端接口的交互数据,在实际测试APP的过程中,我们往往会发现服务端返回 的参数字段错

leboxy的博客 4151

【Vuejs】1117- 全面总结Vue3.0的新特性

总字数:5,864 | 阅读时间:26分钟 Vue3.0从20年九月发布第一个One Piece版本,到现在一直在更新优化;除了服务端渲染的工作,其他工作已经大部分完成了,中文版的官方文档...

pingan8787 615

1.2 机器人控制系统软硬件平台

工业机器人的软硬件平台架构是影响工业机器人性能和效率的重要因素。良好的软硬件平台架构可以帮助工业机器人更加稳定和高效地完成工作,提高生产效率。正确的软硬件配置还可以提高工业机器人的灵活性和可靠性,使其能够更好地适应不断变化的生产环境。 同时,工业机器人的软硬件平台架构还可以影响工业机器人的安全性和维护成本。如果软硬件平台架构不合适,工业机器人可能出现故障或安全隐患,需要大量的维护和维修费用。因此,选择适当的软硬件平台架构对于确保工业机器人的高效运行和长期使用是非常重要的。

Galaxy_Robot的博客 2万+

华为Ascend_toolkit在x86ubuntu安装失败报错。[WARNING] driver package is not installed. If you install in docker

这个报错发生在交叉编译配置Ascend_toolkit环境时,安装Ascend_toolkit安装包的时候发生。[Y/N]Y。

anananajiushiwo的博客 1018

Vuejs 3 Release:One Piece. Vuejs 3.0 正式版发布!代号:海贼王

Vuejs 3.0 在北京时间2020年9月19日凌晨,终于发布了3.0 版本,代号:One Piece。此次vue3.0为用户提供了全新的 composition-api 以及更小的包大小,和更好的 TypeScript 支持。 Vue 是当前非常流行的框架,Vue3.0更是酝酿了2年多的时间,经过2600多次commit,600多次PR,中间也发布了很多beta版本。 终于在经过尤大神和社区的共同努力下,Vue3.0带着全新的 composition-api 正式发布了。

CosyTime 6941

YOLOv11改进 | 主干/Backbone篇 | 轻量级移动端网络ShuffleNetV2(附代码+修改教程)

本文给大家带来的改进内容是ShuffleNetV2,这是一种为移动设备设计的高效CNN架构。其在ShuffleNetV1的基础上强调除了FLOPs之外,还应考虑速度、内存访问成本和平台特性。(我在YOLOv11n上修改该主干降低了GFLOPs,但是参数量还是有一定上涨,其非常适合轻量化的读者来使用,同时精度也有一定程度的上涨)。本文通过介绍其主要框架原理,然后教你如何添加该网络结构到网络模型中。

Snu77的博客 3382

Vue3快速上手资料!手把手带你彻底学会Vue3,超详细讲解!不怕学不会!【建议收藏】【尚硅谷Vue2.0+Vue3.0全套教程丨vuejs从入门到精通vue3笔记资料】

​ Vue3快速上手 1.Vue3简介 2.Vue3带来了什么 1.性能的提升 2.源码的升级 3.拥抱TypeScript 4.新的特性 一、创建Vue3.0工程 1.使用 vue-cli 创建 官方文档:创建一个项目 | Vue CLI ## 查看@vue/cli版本,确保@vue/cli版本在4.5.0以上 vue --version ## 安装或者升级你的@vue/cli npm install -g @vue/cli ## 创建 vue c

南北极之间 976

迅投miniQMT量化交易实战指南:从入门到自动化交易系统构建

迅投miniQMT量化交易实战指南摘要 本文全面介绍迅投miniQMT量化交易系统的开发流程,重点包括: 环境配置:详细说明miniQMT极简模式的安装步骤,包括xtquant库获取、Python版本要求及验证方法 行情数据模块:解析xtdata模块的核心功能,包括: 获取板块分类与股票列表 查询合约基础信息 下载历史K线数据(支持tick、分钟、日线等周期) 交易执行模块:介绍xttrader模块的交易API,涵盖: 账户连接与初始化 订单管理(下单、撤单、查询) 持仓与资产查询 实战开发:提供可直接运行

huanghm88的专栏 665

若依框架二次开发——RuoYi-AI 本地部署流程

若依框架二次开发——RuoYi-AI 本地部署流程

bjzhang75的博客 1783

Vue3 —— 创建 Vue3.0 工程

Vue3.0 工程的创建及简单分析,内含扩展工具安装包。

HuoZhiyan 的博客 2731

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

vue3.0出来了2.0还需要学吗,vue2.0和3.0区别大吗

既然大家会看这篇文章,那么肯定是vue的学习者了,或是遇到的瓶颈,或者刚刚开始学,不知道如何快速起步,本篇文章将带领大家在最短的时间内构件一个学习Vue的学习路线Vuejs的作者尤雨溪尤大也写过一篇关于新手学习vue路径的文章新手向:Vue2.0的建议学习顺序百度vuejs搜索的是vue1的文档,推荐大家直接上2.0,毕竟1和2还是有区别的。就会感觉它们的不同。附上我写的一个入门小demovue-demo-search多看看组件那里,看看如何在vue-cli中怎么实现组件化,说白了,vue玩的就是组件。

aifans_bert的博客 3333

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

vue3.0与vue2.0的区别

Vue 3.0是一个用于构建用户界面的JavaScript框架。相比于Vue 2.x,Vue 3.0在性能、体积和开发体验上都有了很大的提升。有更快的渲染速度:Vue 3.0在虚拟DOM和响应式系统方面进行了优化,可以实现更快的渲染速度。有更小的代码体积:Vue 3.0采用了Tree-shaking技术,可以消除未使用的代码,从而减小应用程序的体积。有更高的容错性:在Vue 3.0中,模板编译错误会抛出编译期错误而不是运行时错误,从而更早地发现问题。

qq_40946635的博客 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Vue3.0和Vue2.0的区别

https://www.cnblogs.com/zdz8207/p/vue-3-2.html vue3.0和2.0的区别 Vue-cli3.0于 8月11日正式发布,看了下评论,兼容性不是很好,命令有不少变化,不是特别的乐观 vue3.0 的发布与 vue2.0 相比,优势主要体现在:更快、更小、更易维护、更易于原生、让开发者更轻松; 更快   1、virtual DOM 完全重写,mounti...

xyx107的博客 2万+

VUE3.0和VUE2.0语法上的不同

前言:本篇文章只做VUE3.0和VUE2.0语法上的不同分析,不做性能和源码架构等的分析。

zhangjing1019的博客 5299
上一篇: vue2.0
下一篇: 最新2022面试题(更新)
onlyeverstudy
博客等级 码龄5年 0粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值