首页 > 其他分享 >创建vue3项目、setup函数、ref函数、reactive函数、计算监听属性、生命周期、torefs、vue3 setup写法

创建vue3项目、setup函数、ref函数、reactive函数、计算监听属性、生命周期、torefs、vue3 setup写法

时间:2023-10-07 16:33:57浏览次数:41  
标签:函数 对象 setup reactive vue3 ref age name

创建vue3项目

# 两种方式
    - vue-cli:vue脚手架---》创建vue项目---》构建vue项目--》工具链
        跟之前一样
    - vite :https://cn.vitejs.dev/
        -npm create vue@latest
        一路选择即可
        
        
 # 运行vue3项目
    -vue-cli跟之前一样
    -vite 创建的:npm install   npm run dev
    
    
 # vite为什么这么快
    -冷启动
    -热加载
    -按需编译

 

补充

# 编程语言的链式调用
    对象.changeName('lqz').printName().showAge()
    
# python 如何实现链式调用
    class Person:
        def changeName(self,name):
            self.name=name
            return self
        def printName(self):
            print(self.name)
            return self

setup函数

# 使用 vue-cli创建的项目讲

setup的两个注意点
# setup执行的时机

在beforeCreate之前执行一次,this是undefined。

# setup的参数
props:值为对象,包含:组件外部传递过来,且组件内部声明接收了的属性。
context:上下文对象
attrs: 值为对象,包含:组件外部传递过来,但没有在props配置中声明的属性, 相当于 this.$attrs。
slots: 收到的插槽内容, 相当于 this.$slots。
emit: 分发自定义事件的函数, 相当于 this.$emit。

    
    
    
# 总结:
    setup执行是在beforeCreate,没有this对象,以后不要用this了
    
    如果写setup函数,想接收父组件自定义属性传入的值,需要
        export default {
          setup(props) {
            console.log(props.msg)
          },
          props: ['msg']
        }
        
    如果是vue3的最新写法,想接收父组件自定义属性传入的值,需要
    <script setup>
    defineProps(['msg'])
    </script>
<template>
  <div class="home">
    <p>我的名字是:{{ name }}</p>
    <p>我的年龄是:{{ age }}</p>
    <button @click="handleClick">点我看信息</button>
  </div>
</template>

<script>


export default {
  setup() {
    // 1 定义数据
    const name = 'lqz'
    let age = 19
    // 2 定义方法
    const showInfo = () => {
      alert(`姓名是:${name},年龄是:${age}`)
    }


    return {name, age, showInfo}


  },
  methods: {
    handleClick() {
      alert(`姓名是:${this.name},年龄是:${this.age}`)
    }
  }
}
</script>

ref函数

<template>
  <div class="home">
    <p>我的名字是:{{ name }}</p>
    <p>我的年龄是:{{ age }}</p>
    <button @click="handleAdd">点我年龄+1</button>
    <button @click="handleChangeName">点我秒变彭于晏</button>
  </div>
</template>

<script>

// 变量要具备响应式---》页面内容变化,变量和变,变量变化,页面也变
// 普通变量,通过ref绑定响应式
// 引用类型变量:通过reactive 绑定响应式
import {ref} from 'vue'

export default {

  setup() {
    // 1 定义数据
    let name = ref('lqz')
    let age = ref(19)
    // 2 定义方法
    const handleAdd = () => {
      age.value += 1
      console.log(typeof age)
    }

    const handleChangeName = () => {
      name.value = '彭于晏'
    }

    return {name, age, handleAdd,handleChangeName}


  },
}
</script>

reactive函数

<template>
  <div class="home">
    <p>我的名字是:{{ data.name }}</p>
    <p>我的年龄是:{{ data.age }}</p>
    <p>我的爱好是:{{ hobby }}</p>
    <button @click="addAge">点我年龄+1</button>
    <br>
    {{ obj.hobby }}
    <br>
    <button @click="changeHobby">点我把保龄球换成足球</button>


    <hr>
    <HelloWorld msg="asdfasdfasdfasdf"></HelloWorld>
  </div>
</template>

<script>

// 变量要具备响应式---》页面内容变化,变量和变,变量变化,页面也变
// 普通变量值类型,通过ref绑定响应式   数字,字符串
// 引用类型变量:通过reactive 绑定响应式   对象,数组

import {reactive, ref} from 'vue'
import HelloWorld from "@/components/HelloWorld.vue";

export default {
  name: 'HomeView',
  setup(props) {

    let hobby = ref('篮球')
    let obj = ref({
      age: 99,
      hobby: '保龄球'
    })

    const changeHobby = () => {
      console.log(obj)
      obj.value.hobby = '足球'
    }


    let data = reactive({
      name: '彭于晏',
      age: 19
    })
    const addAge = () => {
      //data.age++
      console.log(typeof data)
      console.log(data) // 是一个代理对象,无法拿出原来对象,但是操作起来跟操作源对象一样
      data.age++
    }
    return {hobby, data, addAge, obj, changeHobby}


  },
  components: {
    HelloWorld
  }

}


/*
ref
作用: 定义一个响应式的数据
语法: const xxx = ref(initValue)
创建一个包含响应式数据的引用对象(reference对象,简称ref对象)。
JS中操作数据: xxx.value
模板中读取数据: 不需要.value,直接:<div>{{xxx}}</div>
备注:
接收的数据可以是:基本类型(值类型)、也可以是对象(引用类型)类型。


reactive
作用: 定义一个对象类型的响应式数据(基本类型不要用它,要用ref函数)
语法:const 代理对象= reactive(源对象)接收一个对象(或数组),返回一个代理对象(Proxy的实例对象,简称proxy对象)
reactive定义的响应式数据是“深层次的”,无论套多少层,都具备响应式


# 总结:
  如果用基本数据类型:数字,字符串,布尔,用ref做响应式
  如果是对象类型,用ref和reactive都可以,但是建议使用reactive
  如果使用ref包裹对象类型,多了一层value




 */
</script>

计算监听属性

<template>
  <div class="home">
    <input type="text" v-model="name.firstName">
    <input type="text" v-model="name.lastName">
    <br>
    <input type="text" v-model="fullName">


    <button @click="age++">点我年龄加</button>
  </div>
</template>

<script>


import {computed, watch, reactive, ref,watchEffect} from 'vue'

export default {
  name: 'HomeView',
  setup() {
    // 计算属性:computed

    let name = reactive({
      firstName: 'liu',
      lastName: 'qz'
    })

    let fullName = computed({
      get() {
        return name.firstName + '-' + name.lastName
      },
      set(value) {
        const nameArr = value.split('-')
        name.firstName = nameArr[0]
        name.lastName = nameArr[1]

      }
    })

    let age = ref(19)

    // 监听属性

    // 监听基本类型
    watch(age, (newValue, oldValue) => {
      console.log(oldValue)
      console.log(newValue)
    })
    // 监听对象
    watch(() => name.firstName, (newValue, oldValue) => {
      console.log(oldValue)
      console.log(newValue)
    })


    // watchEffect函数
    watchEffect(() => {
      const x1 = age.value
      const x2 = name.firstName
      console.log('watchEffect配置的回调执行了')
    })

    return {name, fullName, age}


  }


}


/*
ref
作用: 定义一个响应式的数据
语法: const xxx = ref(initValue)
创建一个包含响应式数据的引用对象(reference对象,简称ref对象)。
JS中操作数据: xxx.value
模板中读取数据: 不需要.value,直接:<div>{{xxx}}</div>
备注:
接收的数据可以是:基本类型(值类型)、也可以是对象(引用类型)类型。


reactive
作用: 定义一个对象类型的响应式数据(基本类型不要用它,要用ref函数)
语法:const 代理对象= reactive(源对象)接收一个对象(或数组),返回一个代理对象(Proxy的实例对象,简称proxy对象)
reactive定义的响应式数据是“深层次的”,无论套多少层,都具备响应式


# 总结:
  如果用基本数据类型:数字,字符串,布尔,用ref做响应式
  如果是对象类型,用ref和reactive都可以,但是建议使用reactive
  如果使用ref包裹对象类型,多了一层value




 */
</script>

生命周期

# vue2 生命周期---8个

# vue3 变了
    -想把生命周期写下setup函数中
        
    -把生命周期写在配置项中
        beforeDestroy改名为 beforeUnmount
        destroyed改名为 unmounted
        
        beforeCreate
        created
        beforeMount 
        mounted
        beforeUpdate
        updated
        beforeUnmount 
        unmounted
<template>
  <div class="home">
    <h1>首页</h1>
  </div>
</template>

<script>

import axios from "axios";
import {
  computed,
  watch,
  reactive,
  ref,
  watchEffect,
  onBeforeMount,
  onMounted,
  onBeforeUpdate,
  onUpdated,
  onBeforeUnmount,
  onUnmounted
} from 'vue'

export default {
  name: 'HomeView',
  setup() {

    // 第一个beforeCrete
    console.log('我是beforeCrete')

    // 第二个Creted
    let name = ref('lqz')
    console.log('Creted')
    // axios.get().then(res => {
    //   name.value = res.data.name
    // })

    // 直接启动定时器
    let t = setInterval(() => {
          console.log('lqz')
        }, 3000
    )
    // 第三个:onBeforeMount
    onBeforeMount(() => {
      console.log('挂载了')
    })

    onBeforeUnmount(() => {
      clearInterval(t)
      t = null

    })


    return {}


  },


}


</script>

torefs

<template>
  <div class="home">
    <h1>首页</h1>
    {{ name }}---{{ age }}
  </div>
</template>

<script>

import axios from "axios";
import {
  reactive,
  toRefs

} from 'vue'

export default {
  name: 'HomeView',
  setup() {
    let data = reactive({
      name: 'lqz',
      age: 19
    })

    return {...toRefs(data)}
  },


}

// 对象的解压
let data ={'name':'lqz',age:19}
let dict={...data,hobby:'篮球'}

console.log(dict)



</script>

vue3 setup写法

// 以后vue3推荐,把setup函数的代码,直接写在script中
<script setup>
//定义变量
//写函数
//不用return,在html中直接使用
</script>

// 使用组件,直接导入,不需要配置,直接用即可
import HelloWorld from "../components/HelloWorld.vue";
在html中直接用:<HelloWorld msg="NB"></HelloWorld>

// 自定义属性,在子组件中接收
    <script setup>
    defineProps({
      msg: {
        type: String,
        required: true
      }
    })
    </script>

 

标签:函数,对象,setup,reactive,vue3,ref,age,name
From: https://www.cnblogs.com/zfq132/p/17746324.html

相关文章

  • pytorch的四个hook函数
    训练神经网络模型有时需要观察模型内部模块的输入输出,或是期望在不修改原始模块结构的情况下调整中间模块的输出,pytorch可以用hook回调函数来实现这一功能。主要使用四个hook注册函数:register_forward_hook、register_forward_pre_hook、register_full_backward_hook、registe......
  • vue3中defineComponent 的作用详解
    转自:https://www.jb51.net/article/263096.htm 这篇文章主要介绍了vue3中defineComponent 的作用,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 vue3中,新增了defineComponent,它并没有实现任何的逻辑,只是把接收的......
  • 是用非构建工具开始使用Vue3
     <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title>......
  • 生成一个指数回归模型,以预测温度与其他变量的关系, 并给出模型的函数
    #导入所需的库importpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltimportseabornassnsfromsklearn.linear_modelimportLinearRegressionfromsklearn.metricsimportmean_squared_error,r2_score#指定支持中文的字体,例如SimHei或者Microsoft......
  • Vue3中shallowReactive 与 shallowRef 的用法
    转自:https://blog.csdn.net/qq_54527592/article/details/119840044  shallowReactive与shallowRef   shallowReactive:只处理对象最外层属性的响应式(浅响应式)。   shallowRef:只处理基本数据类型的响应式,不进行对象的响应式处理。   什么时候使用?     ......
  • Vue3
    vue3.3.4+vite4.4.91.组件安装1.1ElementPlusnpminstallelement-plus--savemain.jsimportElementPlusfrom'element-plus'import'element-plus/dist/index.css'constapp=createApp(App);app.use(ElementPlus).mount('#app'......
  • Vue3 Div 与 v-for 的配合应用,超出自动带滚动条
    效果图 代码<li><ahref="javascript:;"class="IndReaflexCHuans"><i></i><p>当前会议[0]</p></a><divstyle="height:80%;overflow:auto;"><divv-for="......
  • 核函数
     李政轩老师系列视频https://www.bilibili.com/video/BV1nx41157xz/?spm_id_from=333.337.search-card.all.click&vd_source=6292df769fba3b00eb2ff1859b99d79e   低纬度空间线性不可分,转换到高维空间,可以线性分开。  核函数 ......
  • 函数的基础概念介绍
    函数是什么?简单来说,指一个实数映射到另一个实数的过程;详细来说,指用于描述两个数集之间的关系。一个函数通常由以下三个要素定义(缺一不可):定义域(Domain):函数的定义域是指函数接受输入的所有可能值构成的集合。也就是说,定义域确定了函数可以接受的自变量的范围。值域(Range):函数的......
  • R语言中purrr包中的map函数的使用
    R语言中purrr包中的map函数的使用参考文章:https://bookdown.org/wangminjie/R4DS/tidyverse-purrr.html语法map()函数的第一个参数是list或者vector,第二个参数是函数。注意这里的第一个传参,数据框是列表的一种特殊形式,因此数据框也是可以的。测试d变量的内容为:>d......