• Vue3常用API用法


    父组件

    1. <template>
    2. <div>
    3. <h2>用户管理列表</h2>
    4. <h2>nameNumber {{ nameNumber("set") }}</h2>
    5. <el-row ref="myRow">
    6. <el-form :inline="true" @submit.native.prevent>
    7. <el-form-item label="">
    8. <el-input
    9. @keyup.enter.native="selectClick"
    10. clearable
    11. v-model="nameWatch.test"
    12. maxlength="50"
    13. show-word-limit
    14. placeholder="请输入nameWatch"
    15. >
    16. </el-input>
    17. </el-form-item>
    18. <el-form-item label="">
    19. <el-input
    20. @keyup.enter.native="selectClick"
    21. clearable
    22. v-model="mobileNo"
    23. maxlength="50"
    24. show-word-limit
    25. placeholder="请输入手机号"
    26. >
    27. </el-input>
    28. </el-form-item>
    29. <el-form-item label="">
    30. <el-input
    31. @keyup.enter.native="selectClick"
    32. clearable
    33. v-model="name"
    34. maxlength="50"
    35. placeholder="请输入姓名"
    36. >
    37. </el-input>
    38. </el-form-item>
    39. <el-form-item>
    40. <el-select
    41. v-model="selectForm.selectValue"
    42. filterable
    43. clearable
    44. placeholder="是否选择"
    45. @change="selectClick"
    46. >
    47. <!--<el-option label="全部" :value="null"></el-option>-->
    48. <el-option
    49. v-for="(value, key, i) of selectArr"
    50. :key="i"
    51. :label="value"
    52. :value="key"
    53. >
    54. </el-option>
    55. </el-select>
    56. </el-form-item>
    57. <el-form-item>
    58. <el-button type="primary" @click="selectClick">查 询</el-button>
    59. </el-form-item>
    60. </el-form>
    61. </el-row>
    62. <el-table :data="tableDataTest" style="width: 100%">
    63. <el-table-column prop="date" label="Date" width="200" />
    64. <el-table-column prop="name" label="Name" width="300" />
    65. <el-table-column prop="address" label="Address" />
    66. </el-table>
    67. <el-pagination
    68. @current-change="currentChange"
    69. layout="prev, pager, next"
    70. :total="50"
    71. />
    72. provideTemp.test:
    73. <el-input
    74. clearable
    75. v-model="provideTemp.test"
    76. maxlength="50"
    77. show-word-limit
    78. placeholder="请输入provideTemp.test"
    79. >
    80. </el-input>
    81. <!--子组件-->
    82. <son
    83. :mobileNo="mobileNo"
    84. :form="selectForm"
    85. :tableDataTest="tableDataTest"
    86. @sonClick="sonClickBy"
    87. />
    88. <!--弹框-->
    89. <button @click="dialogVisible = true">打开弹框 {{ dialogVisible }}</button>
    90. <DialogTest
    91. v-if="dialogVisible"
    92. v-model:dialogVisible="dialogVisible"
    93. @close="dialogVisible = false"
    94. />
    95. </div>
    96. </template>
    97. <script setup>
    98. import son from "./son";
    99. import DialogTest from "@/views/user/dialogTest";
    100. import { queryPersonalUserInfoForPage } from "@/api/registUser";
    101. import {
    102. onMounted,
    103. reactive,
    104. ref,
    105. toRefs,
    106. computed,
    107. toRef,
    108. watchEffect,
    109. watch,
    110. watchSyncEffect,
    111. watchPostEffect,
    112. provide,
    113. inject,
    114. nextTick,
    115. getCurrentInstance,
    116. } from "vue";
    117. const dialogVisible = ref(false)
    118. const { proxy } = getCurrentInstance();
    119. console.error("proxy--", proxy);
    120. nextTick(()=>{
    121. proxy.$message.info("已取消删除-info")
    122. // proxy.$message({
    123. // type: "info",
    124. // message: "已取消删除",
    125. // });
    126. return
    127. proxy
    128. .$confirm("此操作将永久删除该数据, 是否继续?", "提示", {
    129. confirmButtonText: "确定",
    130. cancelButtonText: "取消",
    131. type: "error",
    132. })
    133. .then(async () => {
    134. proxy.$message({
    135. type: "success",
    136. message: "已确认删除",
    137. });
    138. })
    139. .catch(() => {
    140. proxy.$message({
    141. type: "info",
    142. message: "已取消删除",
    143. });
    144. });
    145. })
    146. // provide 传值方式 把值传给子组件
    147. let provideTemp = reactive({
    148. test: "test",
    149. });
    150. provide("provideTemp", provideTemp);
    151. const sonClickBy = (value) => {
    152. console.error("sonClickBy--value--", value);
    153. name.value = value;
    154. };
    155. /**
    156. * 搜索
    157. */
    158. /*
    159. * ref 和 reactive的区别
    160. *
    161. * 1.reactive 接受入参必须是对象形式,而 ref 可以是对象形式,也可以是一个单值。
    162. * 2.ref 必须从.value 属性中读取值
    163. *
    164. *
    165. */
    166. // ref 浅层次的响应式 一般用于定义基本数据类型
    167. let name = ref("");
    168. // reactive 让对象转为具有深层次响应式 一般用于定义复杂数据类型(json、数组)
    169. let selectForm = reactive({
    170. mobileNo: "",
    171. selectValue: "",
    172. });
    173. let selectArr = ref({
    174. 1: "测试1",
    175. 2: "测试2",
    176. 3: "测试3",
    177. });
    178. /*
    179. * toRef 和 toRefs 的区别
    180. *
    181. * 1.toRefs 只会为源对象中包含的 property 生成 ref,
    182. * 将对象转换为普通对象,且不丢失对源对象的响应式链接,
    183. * 即修改源对象属性值,生成的新的普通对象的对应属性值(ref)也会修改,反之亦然。
    184. * 2.toRef 为特定的 property 创建 ref, 同样也会保持响应式链接。
    185. * 3.toRef: 复制 reactive 里的单个属性并转成 ref
    186. * toRefs: 复制 reactive 里的所有属性并转成 ref
    187. */
    188. // toRefs 把object对象解构
    189. const { mobileNo } = toRefs(selectForm);
    190. let selectValueRef = toRef(selectForm, "selectValue");
    191. const selectClick = () => {
    192. console.error("selectClick--请求接口--selectForm--", selectForm);
    193. console.error(
    194. "value--name--",
    195. name.value,
    196. selectForm.mobileNo,
    197. mobileNo.value,
    198. selectForm.selectValue
    199. );
    200. console.error("selectValueRef--", selectValueRef.value);
    201. getDataList([
    202. {
    203. date: "2022-09-09",
    204. name: "lyc-win-win-select",
    205. address: "China",
    206. },
    207. ]);
    208. // selectArr.value = {
    209. // 11:"测试111111",
    210. // 22:"测试222222",
    211. // 33:"测试333333"
    212. // }
    213. };
    214. // computed 计算属性使用
    215. // const nameNumber = computed(() => mobileNo.value + name.value)
    216. // const nameNumber = computed({
    217. // get:() => mobileNo.value + name.value,
    218. // set:(value) =>{
    219. // return value + mobileNo.value + name.value
    220. // }
    221. // })
    222. // computed 计算属性(传值)使用
    223. const nameNumber = computed(() => (value) => {
    224. return value + mobileNo.value + name.value;
    225. });
    226. // watchEffect 监听使用
    227. // 一般情况下使用默认的就行,除非是有什么特殊的要求,在选择post或者sync使用
    228. // 取消监听,直接调用 watchEffectTemp(),watchEffect返回取消监听的方法
    229. // flush: 'pre' 默认情况下,侦听器将在组件渲染之前执行
    230. const watchEffectTemp = watchEffect(() => {
    231. let temp = selectForm;
    232. console.log("watchEffect--temp--", temp);
    233. console.log("watchEffect--name--", name.value);
    234. console.log("watchEffect--mobileNo--", mobileNo);
    235. console.log("watchEffect--selectValue--", selectForm.selectValue);
    236. });
    237. // flush: 'post' 将会使侦听器延迟到组件渲染之后再执行
    238. const watchPostEffectTemp = watchPostEffect(() => {
    239. console.log("watchPostEffect--selectValue--", selectForm.selectValue);
    240. });
    241. // flush: 'sync' 在响应式依赖发生改变时立即触发侦听器
    242. const watchSyncEffectTemp = watchSyncEffect(() => {
    243. console.log("watchSyncEffectTemp--selectValue--", selectForm.selectValue);
    244. });
    245. // watch 监听使用
    246. let nameWatch = ref({
    247. test: "",
    248. });
    249. let tempWatch = watch(
    250. nameWatch,
    251. (newV, oldV) => {
    252. console.error("watch--name--", newV, oldV);
    253. getDataList([
    254. {
    255. date: "2022-09-09",
    256. name: "lyc-win-win-select-watch",
    257. address: "China",
    258. },
    259. ]);
    260. },
    261. {
    262. // immediate:true,
    263. deep: true,
    264. }
    265. );
    266. // setTimeout(()=>{
    267. // console.error("停止监听")
    268. // // 停止监听
    269. // tempWatch()
    270. // }, 1000 * 10)
    271. /**
    272. * 查询列表数据
    273. */
    274. let tableDataTest = ref([]);
    275. const getDataList = (value) => {
    276. console.error("请求接口--");
    277. // queryPersonalUserInfoForPage().then((res) => {
    278. // console.error("res--", res);
    279. // });
    280. setTimeout(() => {
    281. name.value = "修改名字";
    282. selectForm.mobileNo = "修改手机号";
    283. // nameNumber.value = "test-set"
    284. // console.error("nameNumber--",nameNumber.value())
    285. // 引用计算属性并传值进去
    286. console.error(
    287. "22-引用计算属性并传值进去--nameNumber--",
    288. nameNumber.value("aa")
    289. );
    290. nameNumber.value = "testtest";
    291. tableDataTest.value = value || [
    292. {
    293. date: "2022-09-09",
    294. name: "lyc",
    295. address: "China",
    296. },
    297. ];
    298. }, 1000 * 2);
    299. };
    300. /**
    301. * 分页查询
    302. */
    303. const currentChange = () => {
    304. getDataList([
    305. {
    306. date: "2022-09-09",
    307. name: "lyc-win-win",
    308. address: "China",
    309. },
    310. ]);
    311. };
    312. const tableData = [
    313. {
    314. date: "2016-05-03",
    315. name: "Tom123",
    316. address: "No. 189, Grove St, Los Angeles",
    317. },
    318. ];
    319. // 获取dom
    320. const myRow = ref(null);
    321. onMounted(() => {
    322. // 引用计算属性并传值进去
    323. console.error(
    324. "11-引用计算属性并传值进去--nameNumber--",
    325. nameNumber.value("aa")
    326. );
    327. tableDataTest.value = tableData;
    328. getDataList();
    329. // 获取dom
    330. console.error(
    331. "myRow-11-offsetWidth",
    332. myRow,
    333. myRow.value.$el.offsetWidth,
    334. myRow.value.$el.offsetHeight
    335. );
    336. console.error(
    337. "myRow-22-clientWidth",
    338. myRow,
    339. myRow.value.$el.clientWidth,
    340. myRow.value.$el.clientHeight
    341. );
    342. console.error(
    343. "myRow-$el-scrollWidth",
    344. myRow,
    345. myRow.value.$el.scrollWidth,
    346. myRow.value.$el.scrollHeight
    347. );
    348. console.error("proxy-onMounted-", proxy);
    349. });
    350. </script>

    子组件

    1. <template>
    2. <div>
    3. <h2>子组件</h2>
    4. <div>mobileNo:{{ mobileNo }}</div>
    5. <div>fomr:{{ form }}</div>
    6. <button @click="sonClick">点击给父组件传值1</button>
    7. <div>provideTemp:{{ provideTemp }}</div>
    8. <div>tableDataTest:{{ tableDataTest }}</div>
    9. </div>
    10. </template>
    11. <script setup>
    12. import { inject } from "vue";
    13. // props 传值方式
    14. const props = defineProps({
    15. showDialog: {
    16. type: Boolean,
    17. default: true,
    18. },
    19. mobileNo: {
    20. type: String,
    21. default: "",
    22. },
    23. form: {
    24. type: Object,
    25. default: null,
    26. },
    27. tableDataTest: {
    28. type: Object,
    29. default: null,
    30. },
    31. });
    32. // inject 接收父组件传过来的值
    33. let provideTemp = inject("provideTemp"); // 调用
    34. const emit = defineEmits();
    35. const sonClick = () => {
    36. emit("sonClick", "sonClick-value");
    37. };
    38. </script>
    39. <style scoped></style>

    子组件 - 弹框

    1. <template>
    2. <el-dialog
    3. v-model="dialogVisible"
    4. title="Tips"
    5. width="30%"
    6. >
    7. <span>This is a message</span>
    8. <template #footer>
    9. <span class="dialog-footer">
    10. <el-button @click="closeHandle">Cancel</el-button>
    11. <el-button type="primary" @click="closeHandle"
    12. >Confirm</el-button
    13. >
    14. </span>
    15. </template>
    16. </el-dialog>
    17. </template>
    18. <script setup>
    19. import {
    20. onMounted,
    21. toRefs,
    22. } from "vue";
    23. const props = defineProps({
    24. dialogVisible: {
    25. type: Boolean,
    26. default: false,
    27. },
    28. })
    29. const { dialogVisible } = toRefs(props)
    30. const emit = defineEmits()
    31. const closeHandle = ()=>{
    32. console.error("closeHandle回调")
    33. emit("update:dialogVisible", false)
    34. }
    35. onMounted(()=>{
    36. console.error("onMounted -- dialogTest.vue--",dialogVisible.value)
    37. })
    38. </script>
    39. <style scoped>
    40. </style>

  • 相关阅读:
    C++面试八股文:聊一聊指针?
    【JVM】运行时数据区之方法区——自问自答
    Mysql和Oracle创建日期和修改日期设置为自动生成
    前端面试合集(三——浏览器)
    【长难句分析精讲】同位语从句
    Java(SpringBoot04)
    java毕业生设计医院门诊分诊系统计算机源码+系统+mysql+调试部署+lw
    云服务器哪家便宜靠谱 | 简单了解亚马逊云科技发展史
    Rockland丨Rockland 抗体修饰-抗体偶联方案
    程序员需要知道的地理知识
  • 原文地址:https://blog.csdn.net/hzj1369/article/details/126953333