IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> Vue3.x快速上手(三)Vite脚手架之组件开发 -> 正文阅读

[JavaScript知识库]Vue3.x快速上手(三)Vite脚手架之组件开发

Vite学习

创建Vite脚手架

  • 安装Vite
  • 用node装确保更新npm版本
npm init @vitejs/app
  • 也可以使用yarn安装?
yarn create @vitejs/app
  • 取名字?

?

  • 选开发技术?

  • ?选js或ts

?

  • 安装依赖

  • ?运行
npm run dev

setup编程

? ? ? ?setup编程中,vue2原来的编写方式是可以共存的,但是两者的作用域不相同

<template>
  {{title}} 
  <input type="text" v-model="title">
  <button @click="handleClick">点击执行</button>
</template>
<script>
  export default {
    beforeCreate(){
      console.log('beforeCreate')
    },
    created(){
      console.log('Created')
    }
  }
</script>
<script setup>
import {ref,onMounted,onUpdated} from 'vue'
let title = ref('你好,vue')
const handleClick = (e)=>{
  console.log('函数执行')
  title.value =  '改变title值'
  console.log(e)
}
onMounted(() => {
  console.log('App渲染完成')
})
onUpdated (() => {
  console.log('App更新')
})

</script>

组件系统

  1. 属性绑定

  • 子组件
<template>
  <button class="s-button" @click="handleClick">{{label}}</button>
</template>
<script setup>
const {label} = defineProps({
  label:{
    required:true,//是否为必传
    type:[String,Number],//值类型
    default(){
      return '默认值'
    }
  }
})
// emit('自定义事件名',自定义事件参数)可以触发自定义组件上的任何自定义事件执行
// 并且将组件内部的一些计算后的数据返回到视图中用来实现组件间的数据传输和事件触发
const emit = defineEmits(['s-click'])
const handleClick = e=>{
  emit('s-click',e.target)
}
</script>
<style scoped>
.s-button{
  background:rebeccapurple;
  color:white;
  padding: 4px 10px;
}
</style>
  • 父组件?
<template>
  <s-button label='年号'></s-button>
  <!--加入 : 才能传其他类型的值-->
  <s-button :label='123' @s-click='handleClick'></s-button>
</template>
<script setup>
import SButton from './components/SButton.vue';
import {ref,onMounted,onUpdated} from 'vue'
const handleClick = e =>{
  console.log(e,'我是点击事件')
}

</script>
<style>
</style>

?

2.? 父子组件双向绑定

  • 子组件
<template>
用户名:<input type="text" :value="username" @input="handleUserChange">  <br>
密码:<input type="text" :value="password" @input="handlePasswordChange">  <br>

</template>
<script setup>
  const {username,password} =defineProps({
    username:{
      type:String
    },
    password:{
      type:String
    }
  })
  // emit('自定义事件名',自定义事件参数)可以触发自定义组件上的任何自定义事件执行
  const emit = defineEmits(['upate:username','update:password'])
   const handleUserChange = e=>{
    console.log(e.target.value)
    // “update:属性”:代表通知该组件使用v-model:属性绑定的参数变化
    //直接触发props中定义的数据变化导致组件内部重新渲染
    emit('update:username',e.target.value)
  }
  const handlePasswordChange = e=>{
    console.log(e.target.value)
    emit('update:password',e.target.value)
  }
</script>
  • 父组件
<template>
 <s-input v-model:username="username" v-model:password="password"></s-input>
  <br>
  {{username}}{{password}}
</template>
<script setup>
import SInput from './components/SInput.vue'
import {ref,onMounted,onUpdated} from 'vue'

const username = ref('账号')
const password = ref('密码')

</script>
<style>
</style>

?

3. 异步组件

  • 子组件
<template>
  <div>{{name}}</div>
</template>
<script setup>
  import {ref} from 'vue'
  //await自动变成异步组件
  await new Promise((resolve)=>{
    setTimeout(resolve,3000)})
  let name = ref('我是子组件')
</script>
  • 父组件?
<template>
<suspense>
  <template #default>
  <s-dive></s-dive>
  </template>
  <template #fallback>
    异步组件正在加载中
  </template>
</suspense>

</template>
<script setup>
import SDive from './components/SDive.vue';

</script>
<style>
</style>

?动态组件

  • page1
<template>
  <div class="page1">
    page1
  </div>
</template>
<script setup>
  import { onMounted,onUnmounted } from 'vue';
  onMounted(()=>{
    console.log('page1加载完成')
  })
  onUnmounted(()=>{
    console.log('page1销毁成功')
  })
</script>
<style>
.page1{
  width: 400;
  height: 200;
  background: yellowgreen;
}
</style>
  • page2
<template>
  <div class="page2">
    page2
  </div>
</template>
<script setup>
  import { onMounted,onUnmounted } from 'vue';
  onMounted(()=>{
    console.log('page2加载完成')
  })
  onUnmounted(()=>{
    console.log('page2销毁成功')
  })
</script>
<style>
.page2{
  width: 400;
  height: 200;
  background: aqua;
}
</style>
  • main.js
import { createApp } from 'vue'
import App from './App.vue'
import Page1 from './components/Page1.vue'
import Page2 from './components/Page2.vue'


//createApp(App).mount('#app')
const app = createApp(App)
app.component('page1',Page1)
app.component('page2',Page2)
app.mount('#app')
  • App.vue
<template>
<s-button label="跳转第一页" @s-click="handleJump('page1')"></s-button>
<s-button label="跳转第二页" @s-click="handleJump('page2')"></s-button>

<component :is='pageName'></component>

</template>
<script setup>
import SButton from './components/SButton.vue';
import {ref,onMounted,onUpdated} from 'vue'
const pageName= ref('page1')
const handleJump=(path)=>{
  pageName.value = path
}
</script>

component加载页面的时候,会销毁前一个页面

?keep-alive嵌套,可以不销毁之前的页面

<keep-alive><component :is='pageName'></component></keep-alive>

keep-alive属性max可以设置,解决不销毁组件内存溢出的问题

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-12 19:30:07  更:2021-11-12 19:31:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 17:57:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码