官方文档:创建一个项目 | Vue CLI
- ## 查看@vue/cli版本,确保@vue/cli版本在4.5.0以上
- vue --version
- ## 安装或者升级你的@vue/cli
- npm install -g @vue/cli
- ## 创建
- vue create vue_test
- ## 启动
- cd vue_test
- npm run serve
官方文档:快速上手 | Vue.js
vite官网:https://vitejs.cn
- ## 创建工程
- npm init vite-app
- ## 进入工程目录
- cd
- ## 安装依赖
- npm install
- ## 运行
- npm run dev
官方文档: 组合式 API 常见问答 | Vue.js
- Object.defineProperty(data, 'count', {
- get () {},
- set () {}
- })
- new Proxy(data, {
- // 拦截读取属性值
- get (target, prop) {
- return Reflect.get(target, prop)
- },
- // 拦截设置属性值或添加新属性
- set (target, prop, value) {
- return Reflect.set(target, prop, value)
- },
- // 拦截删除属性
- deleteProperty (target, prop) {
- return Reflect.deleteProperty(target, prop)
- }
- })
-
- proxy.name = 'tom'
- import {computed} from 'vue'
-
- setup(){
- ...
- //计算属性——简写
- let fullName = computed(()=>{
- return person.firstName + '-' + person.lastName
- })
- //计算属性——完整
- let fullName = computed({
- get(){
- return person.firstName + '-' + person.lastName
- },
- set(value){
- const nameArr = value.split('-')
- person.firstName = nameArr[0]
- person.lastName = nameArr[1]
- }
- })
- }
- //情况一:监视ref定义的响应式数据
- watch(sum,(newValue,oldValue)=>{
- console.log('sum变化了',newValue,oldValue)
- },{immediate:true})
-
- //情况二:监视多个ref定义的响应式数据
- watch([sum,msg],(newValue,oldValue)=>{
- console.log('sum或msg变化了',newValue,oldValue)
- })
-
- /* 情况三:监视reactive定义的响应式数据
- 若watch监视的是reactive定义的响应式数据,则无法正确获得oldValue!!
- 若watch监视的是reactive定义的响应式数据,则强制开启了深度监视
- */
- watch(person,(newValue,oldValue)=>{
- console.log('person变化了',newValue,oldValue)
- },{immediate:true,deep:false}) //此处的deep配置不再奏效
-
- //情况四:监视reactive定义的响应式数据中的某个属性
- watch(()=>person.job,(newValue,oldValue)=>{
- console.log('person的job变化了',newValue,oldValue)
- },{immediate:true,deep:true})
-
- //情况五:监视reactive定义的响应式数据中的某些属性
- watch([()=>person.job,()=>person.name],(newValue,oldValue)=>{
- console.log('person的job变化了',newValue,oldValue)
- },{immediate:true,deep:true})
-
- //特殊情况
- watch(()=>person.job,(newValue,oldValue)=>{
- console.log('person的job变化了',newValue,oldValue)
- },{deep:true}) //此处由于监视的是reactive素定义的对象中的某个属性,所以deep配置有效
- //watchEffect所指定的回调中用到的数据只要发生变化,则直接重新执行回调。
- watchEffect(()=>{
- const x1 = sum.value
- const x2 = person.age
- console.log('watchEffect配置的回调执行了')
- })
vue2.x的生命周期
vue3.0的生命周期
1
- <input type="text" v-model="keyword">
- <h3>{{keyword}}h3>
- template>
-
- <script>
- import {ref,customRef} from 'vue'
- export default {
- name:'Demo',
- setup(){
- // let keyword = ref('hello') //使用Vue准备好的内置ref
- //自定义一个myRef
- function myRef(value,delay){
- let timer
- //通过customRef去实现自定义
- return customRef((track,trigger)=>{
- return{
- get(){
- track() //告诉Vue这个value值是需要被“追踪”的
- return value
- },
- set(newValue){
- clearTimeout(timer)
- timer = setTimeout(()=>{
- value = newValue
- trigger() //告诉Vue去更新界面
- },delay)
- }
- }
- })
- }
- let keyword = myRef('hello',500) //使用程序员自定义的ref
- return {
- keyword
- }
- }
- }
- script>
- setup(){
- ......
- let car = reactive({name:'奔驰',price:'40万'})
- provide('car',car)
- ......
- }
-
-
- setup(props,context){
- ......
- const car = inject('car')
- return {car}
- ......
- }
使用传统OptionsAPI中,新增或者修改一个需求,就需要分别在data,methods,computed里修改 。
我们可以更加优雅的组织我们的代码,函数。让相关功能的代码更加有序的组织在一起。
"移动位置"> - <div v-if="isShow" class="mask">
- <div class="dialog">
- <h3>我是一个弹窗h3>
- <button @click="isShow = false">关闭弹窗button>
- div>
- div>
- import {defineAsyncComponent} from 'vue'
- const Child = defineAsyncComponent(()=>import('./components/Child.vue'))
- <div class="app">
- <h3>我是App组件h3>
- <Suspense>
- <template v-slot:default>
- <Child/>
- template>
- <template v-slot:fallback>
- <h3>加载中.....h3>
- template>
- Suspense>
- div>
2.x 全局 API(Vue) | 3.x 实例 API (app) |
Vue.config.xxxx | app.config.xxxx |
Vue.config.productionTip | 移除 |
Vue.component | app.component |
Vue.directive | app.directive |
Vue.mixin | app.mixin |
Vue.use | app.use |
Vue.prototype | app.config.globalProperties |
- //注册全局组件
- Vue.component('MyButton', {
- data: () => ({
- count: 0
- }),
- template: ''
- })
-
- //注册全局指令
- Vue.directive('focus', {
- inserted: el => el.focus()
- }
- .v-enter,
- .v-leave-to {
- opacity: 0;
- }
- .v-leave,
- .v-enter-to {
- opacity: 1;
- }
-
-
- .v-enter-from,
- .v-leave-to {
- opacity: 0;
- }
-
- .v-leave-from,
- .v-enter-to {
- opacity: 1;
- }
-
-
- v-on:close="handleComponentEvent"
- v-on:click="handleNativeClickEvent"
- />
-
-
- <script>
- export default {
- emits: ['close']
- }
- script>