vue3核心基本语法使用方法

16 篇文章 0 订阅
4 篇文章 0 订阅
<template>
  <div>
    <h2>用户管理列表</h2>
    <h2>nameNumber {{ nameNumber("set") }}</h2>

    <el-row>
      <el-form :inline="true" @submit.native.prevent>
        <el-form-item label="">
          <el-input
              @keyup.enter.native="selectClick"
              clearable
              v-model="nameWatch.test"
              maxlength="50"
              show-word-limit
              placeholder="请输入nameWatch"
          >
          </el-input>
        </el-form-item>
        <el-form-item label="">
          <el-input
            @keyup.enter.native="selectClick"
            clearable
            v-model="mobileNo"
            maxlength="50"
            show-word-limit
            placeholder="请输入手机号"
          >
          </el-input>
        </el-form-item>
        <el-form-item label="">
          <el-input
              @keyup.enter.native="selectClick"
              clearable
              v-model="name"
              maxlength="50"
              placeholder="请输入姓名"
          >
          </el-input>
        </el-form-item>
        <el-form-item>
          <el-select
              v-model="selectForm.selectValue"
              filterable
              clearable
              placeholder="是否选择"
              @change="selectClick"
          >
            <!--<el-option label="全部" :value="null"></el-option>-->
            <el-option
                v-for="(value, key, i) of selectArr"
                :key="i"
                :label="value"
                :value="key"
            >
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item>
          <el-button  type="primary" @click="selectClick"
          >查 询</el-button
          >
        </el-form-item>
      </el-form>
    </el-row>

    <el-table :data="tableDataTest" style="width: 100%">
      <el-table-column prop="date" label="Date" width="200" />
      <el-table-column prop="name" label="Name" width="300" />
      <el-table-column prop="address" label="Address" />
    </el-table>

    <el-pagination
      @current-change="currentChange"
      layout="prev, pager, next"
      :total="50"
    />
  </div>
</template>
<script>
export default {
  data(){
    return {

    }
  }
};
</script>
<script setup>
import { queryPersonalUserInfoForPage } from "@/api/registUser";
import {
  onMounted,
  reactive,
  ref,
  toRefs,
  computed,
  toRef,
  watchEffect,
  watch,
  watchSyncEffect,
  watchPostEffect
} from "vue";

const tableData = [
  {
    date: "2016-05-03",
    name: "Tom123",
    address: "No. 189, Grove St, Los Angeles",
  },
];


onMounted(() => {
  // 引用计算属性并传值进去
  console.error("11-引用计算属性并传值进去--nameNumber--",nameNumber.value("aa"))

  tableDataTest.value = tableData;
  getDataList();
});


/**
 * 搜索
 */
/*
 * ref 和 reactive的区别
 *
 * 1.reactive 接受入参必须是对象形式,而 ref 可以是对象形式,也可以是一个单值。
 * 2.ref 必须从.value 属性中读取值
 *
 *
 */

// ref 浅层次的响应式 一般用于定义基本数据类型
let name = ref("")

// reactive 让对象转为具有深层次响应式 一般用于定义复杂数据类型(json、数组)
let selectForm = reactive({
  mobileNo: "",
  selectValue:"",
});

let selectArr = ref({
    1:"测试1",
    2:"测试2",
    3:"测试3"
  })

/*
 * toRef 和 toRefs 的区别
 *
 * 1.toRefs 只会为源对象中包含的 property 生成 ref,
 *   将对象转换为普通对象,且不丢失对源对象的响应式链接,
 *   即修改源对象属性值,生成的新的普通对象的对应属性值(ref)也会修改,反之亦然。
 * 2.toRef 为特定的 property 创建 ref, 同样也会保持响应式链接。
 * 3.toRef: 复制 reactive 里的单个属性并转成 ref
 *   toRefs: 复制 reactive 里的所有属性并转成 ref
 * 
3、结论
ref复制, 修改响应式数据,不会影响以前的数据,界面会更改。
toRef引用, 修改响应式的数据,会影响以前的数据,界面不会更新。

总结:
ref和toRef的区别
(1). ref本质是拷贝,修改响应式数据不会影响原始数据;toRef的本质是引用关系,修改响应式数据会影响原始数据
(2). ref数据发生改变,界面会自动更新;toRef当数据发生改变是,界面不会自动更新
(3). toRef传参与ref不同;toRef接收两个参数,第一个参数是哪个对象,第二个参数是对象的哪个属性

 */

// toRefs 把object对象解构
const { mobileNo } = toRefs(selectForm);
let selectValueRef = toRef(selectForm,"selectValue");
const selectClick = () => {
  console.error("selectClick--请求接口--selectForm--",selectForm);
  console.error("value--name--",name.value,selectForm.mobileNo,mobileNo.value,selectForm.selectValue)
  console.error("selectValueRef--",selectValueRef.value)
  getDataList([
    {
      date: "2022-09-09",
      name: "lyc-win-win-select",
      address: "China",
    },
  ])

  // selectArr.value = {
  //   11:"测试111111",
  //   22:"测试222222",
  //   33:"测试333333"
  // }
}

// computed 计算属性使用
// const nameNumber = computed(() => mobileNo.value + name.value)

// const nameNumber = computed({
//   get:() => mobileNo.value + name.value,
//   set:(value) =>{
//     return value + mobileNo.value + name.value
//   }
// })
// computed 计算属性(传值)使用
const nameNumber = computed(()=>(value)=>{
  return value + mobileNo.value + name.value
})


// watchEffect 监听使用
// 一般情况下使用默认的就行,除非是有什么特殊的要求,在选择post或者sync使用
// 取消监听,直接调用 watchEffectTemp(),watchEffect返回取消监听的方法

// flush: 'pre' 默认情况下,侦听器将在组件渲染之前执行
const watchEffectTemp = watchEffect(() => {
  let temp = selectForm
  console.log("watchEffect--temp--",temp);
  console.log("watchEffect--name--",name.value);
  console.log("watchEffect--mobileNo--",mobileNo);
  console.log("watchEffect--selectValue--",selectForm.selectValue);
});

// flush: 'post' 将会使侦听器延迟到组件渲染之后再执行
const watchPostEffectTemp = watchPostEffect(() => {
  console.log("watchPostEffect--selectValue--",selectForm.selectValue);
})

// flush: 'sync' 在响应式依赖发生改变时立即触发侦听器
const watchSyncEffectTemp = watchSyncEffect(() => {
  console.log("watchSyncEffectTemp--selectValue--",selectForm.selectValue);
})

// watch 监听使用
let nameWatch = ref({
  test:""
})
let tempWatch = watch(
    nameWatch,
    (newV,oldV)=>{
      console.error("watch--name--",newV,oldV)
      getDataList([
        {
          date: "2022-09-09",
          name: "lyc-win-win-select-watch",
          address: "China",
        },
      ])
    },
    {
      // immediate:true,
      deep:true
    }
)
// setTimeout(()=>{
//   console.error("停止监听")
//   // 停止监听
//   tempWatch()
// }, 1000 * 10)




/**
 * 查询列表数据
 */
let tableDataTest = ref([]);
const getDataList = (value) => {
  console.error("请求接口--");
  // queryPersonalUserInfoForPage().then((res) => {
  //   console.error("res--", res);
  // });
  setTimeout(() => {
    name.value = "修改名字"
    selectForm.mobileNo = "修改手机号"
    // nameNumber.value = "test-set"
    // console.error("nameNumber--",nameNumber.value())

    // 引用计算属性并传值进去
    console.error("22-引用计算属性并传值进去--nameNumber--",nameNumber.value("aa"))

    nameNumber.value = "testtest"

    tableDataTest.value = value || [
      {
        date: "2022-09-09",
        name: "lyc",
        address: "China",
      },
    ];
  }, 1000);
};


/**
 * 分页查询
 */
const currentChange = () => {
  getDataList([
    {
      date: "2022-09-09",
      name: "lyc-win-win",
      address: "China",
    },
  ])
};


</script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值