最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • vue3的基本使用方式

    正文概述 掘金(进阶之路不屈)   2020-12-22   706

    vue3的基础使用;
    composition API的本质其实就是把setup()中的方法和数据注册到data/methods中;
    ref定义简单类型的数据, reactive定义复杂类型的数据;
    vue3基本使用方式

    import {ref , reactive} from 'vue' // reactive只有传入复杂类型(json/arr)才会成为响应式
    export default {
      name: 'App',
      // setup函数是组合api的入口函数
      // 执行时机在beforeCreate之前,所以此时是无法使用data/methods
      // 由于不能在setup不能访问data/methods,此时的this的值为undefined
      // setup只能是同步的
      setup () {
        let {state, deleteLine} = diyFun()
        let count =  ref(0)
        return {state, deleteLine, count} // 暴露出去之后就可以使用这些变量了
      }
    }
    function diyFun() {
      let state = reactive({
        stus: [
          {id: 1, name: 2, age: 3},
          {id: 2, name: 3, age: 4},
          {id: 3, name: 4, age: 5},
          {id: 4, name: 5, age: 6}
        ]
      })
      function deleteLine(index) {
        console.log(index)
        state.stus.splice(index, 1)
      }
      return {state, deleteLine}
    }
    

    reactive注意点: reactive传递的参数必须是object/arr 如果传递了其他的对象,默认情况下修改对象,界面不会自动更新,如果想要 更新,可以通过重新赋值的方式

    // 重新赋值
    function changeTime() {
      let stateDate = reactive({
        time: new Date()
      })
      function changeDetail() {
        let data = new Date(stateDate.time.getTime())
        data.setDate(stateDate.time.getDate() + 1)
        stateDate.time = data
      }
      return {stateDate, changeDetail}
    }
    

    ref的本质其实还是reactive,当我们给ref函数传递一个值之后,ref 函数会自动的转化成{value: xx},只是中间自动帮我们套了一层value const name = ref(1) => name: {value: 1} 所以当我们修改值时,name.value = ‘xxx',此时才能进行响应式更新. 同理: shallowRef本质上也是shallowReactive

    递归监听(通过ref和reactive来创建得数据) 在多层嵌套得对象中,vue3会递归每一层对象,并对每一层对象创建一个proxy进行监听,所以非常消耗性能,

      let obj = reactive({
          a: {
              b: 'v',
              c: {
                  d: '666',
                  e: {
                      f: '7777'
                  }
              }
          }
      })
    

    非递归监听 shallowReactive shallowRef, 只会监听最外一层
    修改, 单独修改obj.a.b是不会重新渲染得,因为是没有被proxy监听得,
    只有同时修改了obj得第一层属性值才会重新渲染,只有obj被proxy监听了

    let obj = shallowReactive({
          name: '11111',
          a: {
              b: 'v',
              c: {
                  d: '666',
                  e: {
                      f: '7777'
                  }
              }
          }
      })
     // 修改, 单独修改obj.a.b是不会重新渲染得,因为是没有被proxy监听得,
    // 只有同时修改了obj得第一层属性值才会重新渲染,只有obj被proxy监听了
    obj.name = 'zhangsan'
    obj.a.b = '7777777'
    

    通过shallowRef创建得数据,监听得是obj.value得值,修改方式如下,将整个对象提出来修改
    如果只想单独修改一个值, 配合triggerRef(obj)使用,此时会重新渲染界面
    注意:没有triggerReactive()方法

    obj.value = {
                name: 'asdasdasd',
                a: {
                    b: 'asdasdasd',
                    c: {
                        d: '66132126',
                        e: {
                            f: '7123123777'
                        }
                    }
                }
            }
    
    // 如果只想单独修改一个值, 配合triggerRef(obj)使用,此时会重新渲染界面
    // 注意:没有triggerReactive()方法
    obj.value.name = 'asdasdasd123123'
    triggerRef(obj)
    

    toRaw方法,在有些情况下,我们修改了reactive/ref中得数据得时候,并不希望他去更新UI
    但是他本身是响应式得,此时可以使用toRaw来避免这种更新达到提升性能得作用
    reactive创建得数据

    let obj2 = toRaw(obj)
    obj2.name  = '123123123123' // 此时obj中proxy代理得值也发生变化了,但是界面没有更新
    //  ref创建得数据想使用toRow得话
    let obj2 = toRaw(obj.value) // 因为ref本质还是reactive
    obj2.name  = '123123123123'
    

    markRow 使某个值永远不会响应式

    let obj = {a: 1, b: 2}
    obj = markRow(obj)
    let state = reactive(obj) //此时state的值再发生修改就不会重新渲染了
    

    toRef和ref定义数据

    let obj = {a: 1, b: 2}
    let state = ref(obj.a)
    let state = toRef(obj, name)
    /*
    此时修改state.value的值。obj中对应的a的值不会更改,但是UI会自动更新
    如果使用的是toRef,在修改了数据之后,obj的值会跟着变化,但是UI不会更新
    */
    

    也可以使用toRefs

    let state = toRefs(obj) // 直接遍历obj中所有的属性,作用和toRef差不多,修改原始数据
    

    vue3中使用生命周期函数和获取dom得方式 使用生命周期->引入对应得生命周期函数,在setup中使用onMounted()

    //       <div ref="box"> 123123123</div>
    let box = ref(null) // 定义一个空的ref数据,将该数据暴露出去给节点绑上ref值
    onMounted(() => {
      console.log(box.value) // 即可拿到节点对象
    })
    return {box}
    
    readonly:创建一个只读的数据,并且是递归只读
    let state = readonly({name: 1, attr: {a:1, b: 2})
    shallowReadonly:用于创建一个只读的数据,但不是递归只读的,只能用于第一层
    isReadonly()用于判断该值是不是只读的
    

    起源地下载网 » vue3的基本使用方式

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元