vue3组合式笔记

分页示例代码:

  <!-- 示例dialog组件引入 -->
  <flight-dialog :key="addKey" ref="flightDialogRef" @submit="submit"></flight-dialog>
  
  const flightDialogRef = ref();
  // 调用子组件的方法
  flightDialogRef.value.init(key.value);
  // 调用父组件的方法
  const submit = (qarIds: sgtring[]) => {
	  qarIdValue.qarIds = qarIds;
	  recordParamsSavaAll();
	};
<template>
  <el-dialog v-model="visible" title="选择航班" @close="onClose">
    <el-table
      ref="multipleTableRef"
      @selection-change="handleSelectionChange"
      :data="data.dataLists"
      style="width: 100%"
      :row-key="(row) => row.qarId"
    >
      <el-table-column type="selection" :reserve-selection="true" width="55" />
      <el-table-column prop="qarId" label="航班ID" width="180" />
      <el-table-column prop="tkoApt" label="起飞机场" width="180" />
      <el-table-column prop="lndApt" label="着陆机场" width="180" />
      <el-table-column prop="tkoTime" label="起飞时间" width="180" />
      <el-table-column prop="lndTime" label="着陆时间" width="180" />
    </el-table>
    <el-pagination
      :current-page="data.page"
      :page-sizes="[10, 20, 50, 100]"
      :page-size="data.limit"
      :total="data.total"
      layout="total, sizes, prev, pager, next, jumper"
      @size-change="pageSizeChangeHandle"
      @current-change="pageCurrentChangeHandle"
    >
    </el-pagination>
    <div class="flight-dialog-footer">
      <el-button @click="onClose">取消</el-button>
      <el-button type="primary" @click="dataFormSubmitHandle">确定</el-button>
    </div>
  </el-dialog>
</template>

<script lang="ts" setup>
import { reactive, ref, watch } from "vue";
import baseService from "@/service/baseService";
import { useI18n } from "vue-i18n";
import { ElMessage, ElMessageBox } from "element-plus";
import basModuleApi from "@/api/basModuleApi";
import { IObject } from "@/types/interface";
import acRegUrl from "@/api/bas/basAcReg";
const { t } = useI18n();
const visible = ref(false);
// 子组件调用父组件的方法
const emits = defineEmits(["submit"]);

// 列表数据
let data = reactive({
  dataLists: [] as any[],
  page: 1,
  limit: 10,
  total: 10,
  params: {
    qarType: -1,
  },
});
const multipleTableRef = ref<InstanceType<typeof ElTable>>();
const multipleSelection = ref<any[]>([]);
// 复选框事件
const handleSelectionChange = (val: any[]) => {
  multipleSelection.value = val;
};
// 关闭
const onClose = () => {
  visible.value = false;
  data.dataLists = []; // 清空数据
  multipleTableRef.value!.clearSelection(); // 取消复选框
};

// pageSize改变
const pageSizeChangeHandle = (val: number) => {
  data.page = 1;
  data.limit = val;
  flightRequest();
};

// 分页, 当前页
const pageCurrentChangeHandle = (val: number) => {
  data.page = val;
  flightRequest();
};

// 初始化数据
const init = (qarType: number) => {
  visible.value = true;
  data.params.qarType = qarType;
  data.page = 1;
  data.limit = 10;
  flightRequest();
};

const dataFormSubmitHandle = () => {
  if (multipleSelection.value.length > 0) {
    ElMessageBox.confirm("你确定要执行实时计算吗?", "执行确认", {
      confirmButtonText: "确定",
      cancelButtonText: "取消",
      type: "warning",
    }).then((val: string) => {
      const qarIds: String[] = multipleSelection.value.map(item =>  item.qarId);
      emits("submit", qarIds);
    });
  } else {
    ElMessage.warning("请选择要测试的航班");
  }
};

// 获取信息
const flightRequest = () => {
  baseService
    .get("/sys/derqarflight/getListByQarTypeId", {
      limit: data.limit,
      page: data.page,
      qarTypeId: data.params.qarType,
      isvalid: "Y",
    })
    .then((res) => {
      if (res.code == 0) {
        data.dataLists = res.data.list;
        data.total = res.data.total;
      }
    });
};

// 暴漏给父节点对象的方法 父组件获取子组件的方法
defineExpose({
  init,
});
</script>
<style scoped>
.flight-dialog-footer {
  display: flex;
  justify-content: center;
  align-items: center;
  margin-top: 20px;
  margin-bottom: 20px;
}
</style>

dfdf {{count}} {{state.count}}
{{computedValue}}

// // 校验 submit 事件
// submit: ({ email, password }) => {
// if (email && password) {
// return true
// } else {
// console.warn(‘Invalid submit event payload!’)
// return false
// }
// }
// })

// function submitForm(email, password) {
// emit(‘submit’, { email, password })
// }
// <input
// type=“text”
// :value=“lastName”
// @input=“$emit(‘update:lastName’, $event.target.value)”
// />
import { onMounted, watch, watchEffect, computed, nextTick, reactive, ref } from “vue”;
import { CacheToken } from “@/constants/cacheKey”;
import baseService from “@/service/baseService”;
import { setCache } from “@/utils/cache”;
import { ElMessage } from “element-plus”;
import { getUuid } from “@/utils/utils”;
import app from “@/constants/app”;
import { useAppStore } from “@/store”;
import { useRouter } from “vue-router”;
import { useI18n } from “vue-i18n”;

const store = useAppStore();

const router = useRouter();
const { t } = useI18n();

// 在一个特定的 DOM 元素或子组件实例被挂载后,
// 获得对它的直接引用。这可能很有用,比如说在组件挂载时将焦点设置到一个 input 元素上,
// 或在一个元素上初始化一个第三方库
const inputRef = ref<HTMLInputElement | null>(null)

// 定义响应式变量
const count = ref(0);
// 返回原始对象的代理对象(proxy)
const raw = { count: 0 };
// 定义响应式对象
const state = reactive(raw)

// 一个计算属性 ref
const computedValue = computed(() => {
return state.count > 3 ? ‘Yes’ : ‘No’
})

// 侦听状态后,执行异步操作; 不能直接侦听响应式对象的属性值
watch(state, async (newValue, oldValue) => {
console.log(newValue.count, oldValue.count);
})

// getter函数侦听
watch(() => state.count, (count)=>{
console.log(‘getter-count-watch’+count);
})
// 多属性侦听
watch([() => state.count, state], ([count, state])=>{
console.log(‘多-getter-count-watch’+count);
console.log(‘多-count-watch’, state.count);

// 立即执行;获取更新后的dom

},{ immediate: true, flush: ‘post’ })

// 副作用侦听
watchEffect(() => {
// 立即执行watch
console.log(‘watchEffect’ + state.count)

},{flush: ‘post’ })

const clickment = () => {
count.value++;
state.count++;
// raw.count++;
nextTick(() => {
// 访问更新后的 DOM

// ref
(inputRef.value as any).focus()

})
}
// 在组件完成初始渲染并创建 DOM 节点后运行
onMounted(() => {
console.log("count: " + count);
});

setTimeout(() => {
onMounted(() => {
// 异步注册时当前组件实例已丢失
// 这将不会正常工作
})
}, 100)

父子组件传值

props接收的是字符串不需要加冒号:url,变量才需要冒号:visible

// 父组件 监听事件@refreshDataList
<import url="dfdf" title="fafa" :visible="false" ref="importRef"  @refreshDataList="refreshDataListHandle"></import>
// 父组件调用子组件的方法
const importRef = ref();
const importHandle = () => {
  importRef.value.init(`sys/qardecodetypeconf/upload?qarTypeId=${1}`)
}
// 监听事件
const refreshDataListHandle = (bol:boolen) => {
  conosle.log(bol);
}


// 子组件
const props = defineProps(["url","title","visible"])
console.log(props.url);
console.log(props.title);

// 子组件绑定事件
const emit = defineEmits({
  refreshDataList: (bol:boolean)=>{
    if (bol != null) {
      return true
    } else {
      console.warn('Invalid submit event payload!')
      return false
    }
  }
});
// 子组件发布事件
emit.refreshDataList(true)

// 子组件方法
const init = (path: string) => {
  visible.value = true;
  url.value = getTokenUrl(path);
  console.log(url.value)
  
  fileList.value = [];
};
// 子组件暴露方法
defineExpose({
  init
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3.0 推出了一种全新的 API,即组合式 API,它可以让我们更好地组织 Vue 组件代码。这里是一些 Vue 组合式 API 的笔记: ### setup `setup` 是组合式 API 的一个钩子函数,它在 `beforeCreate` 之前被调用。`setup` 函数接收两个参数: - `props`: 组件的属性对象 - `context`: 组件上下文对象 `setup` 函数必须返回一个对象,这个对象包含组件内部需要用到的数据、方法等。 ```javascript import { ref } from 'vue' export default { props: { msg: String }, setup(props, context) { const count = ref(0) // ref 可以用来定义响应式数据 const increase = () => count.value++ return { count, increase } } } ``` 在组件模板,可以直接使用 `count` 和 `increase`,它们都是响应式的。 ### reactive `reactive` 可以用来创建一个响应式的对象。 ```javascript import { reactive } from 'vue' const state = reactive({ count: 0, msg: 'Hello' }) ``` 在模板,可以直接使用 `state.count` 和 `state.msg`。 ### ref `ref` 可以用来创建一个响应式的值。 ```javascript import { ref } from 'vue' const count = ref(0) ``` 在模板,可以直接使用 `count.value`。 ### computed `computed` 可以用来定义一个计算属性。 ```javascript import { computed, ref } from 'vue' const count = ref(0) const doubleCount = computed(() => count.value * 2) ``` 在模板,可以直接使用 `doubleCount`。 ### watch `watch` 可以用来监听一个响应式值的变化。 ```javascript import { watch, ref } from 'vue' const count = ref(0) watch(count, (newValue, oldValue) => { console.log(`count changed from ${oldValue} to ${newValue}`) }) ``` ### 生命周期钩子函数 组合式 API ,可以使用 `onBeforeMount`、`onMounted`、`onBeforeUpdate`、`onUpdated`、`onBeforeUnmount`、`onUnmounted` 等函数来替代传统的生命周期钩子函数。 ```javascript import { onMounted, onUnmounted } from 'vue' export default { setup() { onMounted(() => { console.log('mounted') }) onUnmounted(() => { console.log('unmounted') }) } } ``` 以上是 Vue 组合式 API 的一些笔记,希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值