2024-08-13



<template>
  <div>
    <h1>Vue 3.2 + TypeScript + Pinia 学习笔记</h1>
    <p>{{ count }}</p>
    <button @click="increment">增加</button>
  </div>
</template>
 
<script lang="ts">
import { defineComponent, ref } from 'vue';
import { useStore } from './store';
 
export default defineComponent({
  setup() {
    const store = useStore();
    const count = ref(0);
 
    function increment() {
      store.increment();
      count.value++;
    }
 
    return { count, increment };
  },
});
</script>

这个简单的Vue组件演示了如何在Vue 3.2应用程序中使用TypeScript和Pinia状态管理库。组件包含一个计数器,当用户点击按钮时,会调用increment函数来增加状态中的计数值和本地计数值。这个例子展示了如何组合Vue 3的Composition API和Pinia状态管理,以及如何在TypeScript环境中进行Vue开发。

2024-08-13



# 安装TypeScript
npm install -g typescript
 
# 检查TypeScript版本
tsc --version
 
# 初始化npm项目
npm init -y
 
# 安装TypeScript和ts-node作为项目依赖
npm install --save-dev typescript ts-node
 
# 创建tsconfig.json文件
tsc --init
 
# 编辑tsconfig.json文件,根据需要配置编译选项
{
  "compilerOptions": {
    "target": "es5",                                  /* 指定ECMAScript目标版本 */
    "module": "commonjs",                             /* 指定使用模块系统 */
    "strict": true,                                   /* 启用所有严格类型检查选项 */
    "esModuleInterop": true                           /* 允许导入使用的模块与ES模块系统兼容 */
    // 其他配置...
  }
}
 
# 运行ts-node直接执行TypeScript代码
ts-node your-script.ts

这个例子展示了如何在一个新的Node.js项目中安装和配置TypeScript环境。它首先全局安装TypeScript,然后在项目中安装必要的包。接着,它运行tsc --init来创建一个默认的tsconfig.json文件,并可能编辑这个文件来满足特定项目的需求。最后,它演示了如何使用ts-node工具来直接运行TypeScript代码。

2024-08-13

在Taro框架中使用NutUI和Vue3结合TypeScript来自定义一个Tabbar的基本步骤如下:

  1. 安装NutUI组件库:



npm install @nutui/taro --save
  1. src/components目录下创建一个Tabbar.vue文件,并使用Composition API编写代码:



<template>
  <nut-tabbar active-color="#FF312D">
    <nut-tabbar-item icon="home" text="首页"></nut-tabbar-item>
    <nut-tabbar-item icon="category" text="分类"></nut-tabbar-item>
    <nut-tabbar-item icon="find" text="发现"></nut-tabbar-item>
    <nut-tabbar-item icon="cart" text="购物车"></nut-tabbar-item>
    <nut-tabbar-item icon="my" text="我的"></nut-tabbar-item>
  </nut-tabbar>
</template>
 
<script lang="ts">
import { ref } from 'vue';
import { Tabbar, TabbarItem } from '@nutui/taro';
export default {
  components: {
    'nut-tabbar': Tabbar,
    'nut-tabbar-item': TabbarItem
  },
  setup() {
    // 这里可以添加更多的逻辑,比如监听tab变化等
    return {};
  }
};
</script>
  1. src/app.vue中引入自定义的Tabbar组件:



<template>
  <view class="app">
    <!-- 页面内容 -->
    <Tabbar />
  </view>
</template>
 
<script lang="ts">
import { defineComponent } from 'vue';
import Tabbar from './components/Tabbar.vue';
 
export default defineComponent({
  components: {
    Tabbar
  },
  setup() {
    return {};
  }
});
</script>
 
<style>
/* 样式 */
</style>

这样就完成了一个简单的自定义Tabbar的创建。你可以根据实际需求添加更多的功能,比如监听Tab的变化,处理路由跳转等。

2024-08-13

以下是一个使用Nuxt 3、TypeScript 和 UnoCSS 的开源项目的基本框架代码示例:

nuxt.config.ts 配置文件:




import { defineNuxtConfig } from 'nuxt3'
 
export default defineNuxtConfig({
  // 配置选项
  buildModules: [
    // 引入Unocss模块
    '@unocss/nuxt',
    // ...其他模块
  ],
  unocss: {
    // UnoCSS 配置
    presets: [
      // 预设
    ],
  },
  // 其他配置...
})

pages/index.vue 页面文件:




<template>
  <main>
    <h1>欢迎来到我的网站</h1>
    <!-- 使用Unocss定义样式 -->
    <p class="text-center text-blue-500">这是一个居中且带有蓝色的文本。</p>
  </main>
</template>
 
<script setup lang="ts">
// TypeScript 脚本部分
</script>

components/MyComponent.vue 组件文件:




<template>
  <button class="btn">按钮</button>
</template>
 
<script setup lang="ts">
// TypeScript 脚本部分
</script>
 
<style scoped>
/* 使用Unocss定义样式 */
.btn {
  @apply bg-green-500 p-2 rounded;
}
</style>

这个示例展示了如何在Nuxt 3项目中使用TypeScript和Unocss。在nuxt.config.ts中配置了Nuxt和Unocss,在页面和组件中使用Unocss的at-rules定义样式。

2024-08-13

以下是一个使用React, dumi和TypeScript搭建组件库的基本步骤和示例代码:

  1. 初始化项目:



npx create-react-app my-component-library --template typescript
cd my-component-library
  1. 添加dumi支持:



npm install --save-dev dumi
  1. 修改package.json,添加dumi脚本:



{
  "scripts": {
    "start": "dumi dev",
    "build": "dumi build",
    "preview": "dumi preview"
  }
}
  1. 创建组件文件,例如Button.tsx



import React from 'react';
 
export type ButtonProps = {
  label: string;
  onClick: () => void;
};
 
const Button: React.FC<ButtonProps> = ({ label, onClick }) => (
  <button onClick={onClick}>{label}</button>
);
 
export default Button;
  1. 创建dumi配置文件.umirc.ts



export default {
  mfsu: {},
  theme: {
    // 自定义主题配置
  },
  // 其他dumi配置
};
  1. 创建组件的API文档,在docs/button.mdx



import { Button } from '../src/Button';
 
# Button
 
A simple button component.
 
## Usage
 
```jsx
import React from 'react';
import { Button } from 'my-component-library';
 
export default () => <Button label="Click Me" onClick={() => alert('Clicked!')} />;



 
7. 启动dumi开发服务器:
```bash
npm start
  1. 构建组件库:



npm run build
  1. 预览构建结果:



npm run preview

以上步骤和代码示例展示了如何使用React和TypeScript搭建一个简单的组件库,并使用dumi进行文档编写和组件展示。开发者可以根据自己的需求进一步扩展和定制。

2024-08-13

在Vue 3中,你可以通过创建一个全局变量,并在组件中使用来实现全局变量的使用。以下是一个简单的例子:

  1. main.js 中定义全局变量:



import { createApp } from 'vue'
import App from './App.vue'
 
const app = createApp(App)
 
// 设置全局变量
app.config.globalProperties.$myGlobal = 'Hello, Vue 3!'
 
app.mount('#app')
  1. 在任何组件中使用全局变量:



<template>
  <div>{{ $myGlobal }}</div>
</template>
 
<script>
export default {
  mounted() {
    console.log(this.$myGlobal); // 将输出: 'Hello, Vue 3!'
  }
}
</script>

在这个例子中,我们在 main.js 中通过 app.config.globalProperties 定义了一个全局变量 $myGlobal。然后在任何组件中,我们都可以通过 this.$myGlobal 来访问这个全局变量。

2024-08-13

在Vue 3和TypeScript中实现登录按钮的防抖和节流,可以使用自定义指令。

防抖(Debounce): 指在一定时间内,无论触发多少次回调函数,只在最后一次触发后执行。

节流(Throttle): 指一定时间内只能触发一次回调函数。

以下是实现防抖和节流的自定义指令的示例代码:




import { DirectiveBinding } from 'vue';
 
// 防抖函数
function debounce(fn: Function, delay: number) {
  let timeoutId: number | null = null;
  return function (...args: any) {
    if (timeoutId !== null) {
      clearTimeout(timeoutId);
    }
    timeoutId = window.setTimeout(() => {
      fn.apply(this, args);
    }, delay);
  };
}
 
// 节流函数
function throttle(fn: Function, delay: number) {
  let lastCall = 0;
  return function (...args: any) {
    const now = new Date().getTime();
    if (now - lastCall < delay) {
      return;
    }
    lastCall = now;
    fn.apply(this, args);
  };
}
 
// 自定义指令
const vDebounce: DirectiveFunction = (el, binding) => {
  const handler = debounce(() => {
    binding.value();
  }, binding.arg ? parseInt(binding.arg) : 1000);
  el.addEventListener('click', handler);
};
 
const vThrottle: DirectiveFunction = (el, binding) => {
  const handler = throttle(() => {
    binding.value();
  }, binding.arg ? parseInt(binding.arg) : 1000);
  el.addEventListener('click', handler);
};
 
// 注册自定义指令
export default {
  install(app: App) {
    app.directive('debounce', vDebounce);
    app.directive('throttle', vThrottle);
  },
};

在Vue组件中使用这些指令:




<template>
  <button v-debounce="login" delay="2000">登录(防抖2秒)</button>
  <button v-throttle="login" delay="2000">登录(节流2秒)</button>
</template>
 
<script lang="ts">
import { defineComponent } from 'vue';
 
export default defineComponent({
  setup() {
    const login = () => {
      // 登录逻辑
    };
 
    return { login };
  },
});
</script>

在这个例子中,v-debouncev-throttle 是自定义的指令,它们分别应用了防抖和节流的策略。login 是一个方法,它将包含登录逻辑。通过 delay 参数,可以指定延迟时间,单位是毫秒。

2024-08-13

Ant Design Pro 是基于Ant Design和Umi.js的企业级中后台解决方案,ProTable 是其中的一个高级表格组件,用于简化表格的开发流程。

在Ant Design Pro中,通常会有一个通用的打印组件用于处理表格数据的打印。以下是一个简单的示例,展示如何创建一个通用的打印组件,用于Ant Design Pro的ProTable组件。




import { Button, Popconfirm, Table } from 'antd';
import { useEffect, useRef } from 'react';
import ProTable from '@ant-design/pro-table';
import html2canvas from 'html2canvas';
import jsPDF from 'jspdf';
 
const CommonPrint = ({ tableRef }) => {
  const handlePrint = () => {
    const tableNode = tableRef.current;
    html2canvas(tableNode).then((canvas) => {
      const imgData = canvas.toDataURL('image/png');
      const pdf = new jsPDF({
        orientation: 'landscape',
      });
      const imgProps = pdf.getImageProperties(imgData);
      const pdfWidth = pdf.internal.pageSize.getWidth();
      const pdfHeight = (imgProps.height * pdfWidth) / imgProps.width;
      pdf.addImage(imgData, 'PNG', 0, 0, pdfWidth, pdfHeight);
      pdf.save('table.pdf');
    });
  };
 
  return (
    <Button type="primary" onClick={handlePrint}>
      打印
    </Button>
  );
};
 
export default () => {
  const tableRef = useRef(null);
  return (
    <>
      <ProTable
        ref={tableRef}
        // ... 其他 ProTable 属性
      />
      <CommonPrint tableRef={tableRef} />
    </>
  );
};

在这个示例中,我们定义了一个CommonPrint组件,它接收一个ref(tableRef),该ref指向包含表格的DOM元素。handlePrint函数使用html2canvas库将表格转换为一个canvas,然后使用jsPDF库将canvas保存为PDF文件。

ProTable组件外部,我们创建了一个tableRefref,并将其传递给CommonPrint组件。当用户点击打印按钮时,handlePrint函数被调用,并生成PDF文件。这个通用打印组件可以被应用中的任何ProTable实例使用,简化打印功能的实现。

2024-08-13



// 引入 Vue 和 Vue-router
import Vue from 'vue';
import Router from 'vue-router';
 
// 引入页面组件
import HomePage from '@/components/HomePage';
import LoginPage from '@/components/LoginPage';
import RegisterPage from '@/components/RegisterPage';
 
// 使用 Vue-router
Vue.use(Router);
 
// 创建 router 实例
const router = new Router({
  mode: 'history', // 使用 HTML5 History 模式
  routes: [
    {
      path: '/',
      name: 'home',
      component: HomePage
    },
    {
      path: '/login',
      name: 'login',
      component: LoginPage
    },
    {
      path: '/register',
      name: 'register',
      component: RegisterPage
    }
  ]
});
 
// 将 router 实例导出,以便在 Vue 应用中使用
export default router;

这段代码展示了如何在 Vue.js 应用中设置 Vue-router,并定义了三个页面路由。通过创建一个 Router 实例并定义路由规则,我们可以在应用中实现页面的导航和视图的切换。这是开发单页应用时一个非常基础但重要的概念。

2024-08-13

这些文件是Vue项目中的配置文件,它们分别用于配置npm包管理、环境变量、commitizen的配置、以及commitlint的规则。

  1. .npmrc 文件: 用于配置npm包管理。例如,你可以设置默认的registry或其它npm配置。



registry=https://registry.npm.taobao.org
  1. .env 文件: 用于设置环境变量。例如,你可以设置API的URL或其它环境相关的变量。



VUE_APP_API_URL=https://api.example.com
  1. .cz-config.js 文件: 用于commitizen的配置,用于规范提交信息。



module.exports = {
  types: [
    { value: 'feat', name: 'feat:     新功能' },
    { value: 'fix', name: 'fix:      修补' },
    { value: 'docs', name: 'docs:     文档变更' },
    { value: 'style', name: 'style:    格式(不影响代码运行的变动)' },
    { value: 'refactor', name: 'refactor:重构(即不是新增功能,也不是修复bug的代码变动)' },
    { value: 'perf', name: 'perf:     性能优化' },
    { value: 'test', name: 'test:     增加测试' },
    { value: 'chore', name: 'chore:    构建过程或辅助工具的变动' },
    { value: 'revert', name: 'revert:   回退' },
    { value: 'build', name: 'build:    打包' }
  ],
  skipQuestions: ['body', 'footer'],
  subjectLimit: 100,
};
  1. commitlint.config.js 文件: 用于commitlint的规则配置,用于规范提交信息。



module.exports = {
  extends: ['@commitlint/config-conventional'],
  rules: {
    'type-enum': [2, 'always', [
      'feat', 'fix', 'docs', 'style', 'refactor', 'perf', 'test', 'chore', 'revert', 'build'
    ]],
    'subject-full-stop': [0, 'never'],
    'subject-case': [0, 'never'],
  }
};

以上代码示例提供了如何配置这些文件,以确保团队的提交信息和代码风格保持一致。