zff 发布的文章

在Vue 3中,如果你想在渲染前处理数据,你可以使用几种不同的生命周期钩子和响应式API来确保数据被正确处理。以下是一些常用的方法:

1. 使用 setup 函数

Vue 3引入了Composition API,其中setup函数是组件实例被创建之前执行的,适合在这里进行数据的初始化和处理。

<script setup>
import { ref, onMounted } from 'vue';

const data = ref(null);

onMounted(async () => {
  // 假设 fetchData 是异步获取数据的函数
  const result = await fetchData();
  data.value = result; // 处理并设置数据
});
</script>

2. 使用 onBeforeMount 生命周期钩子

如果你使用的是Options API,可以在onBeforeMount生命周期钩子中处理数据。

export default {
  data() {
    return {
      data: null,
    };
  },
  methods: {
    fetchData() {
      // 异步获取数据
    },
    processData(data) {
      // 处理数据
    }
  },
  mounted() {
    this.fetchData().then((data) => {
      this.data = this.processData(data);
    });
  }
};

3. 使用 watchwatchEffect

如果你需要在数据变化时进行处理,可以使用watchwatchEffect

<script setup>
import { ref, watch } from 'vue';

const data = ref(null);

watch(data, (newData) => {
  // 在数据变化时进行处理
  console.log('Data has changed:', newData);
});
</script>

4. 使用 computed 属性

如果你需要根据现有数据派生出新数据,可以使用computed属性。

<script setup>
import { ref, computed } from 'vue';

const rawData = ref(null);

const processedData = computed(() => {
  if (!rawData.value) return null;
  // 对 rawData 进行处理
  return rawData.value.map(item => ({
    ...item,
    processed: true
  }));
});
</script>

5. 使用 asyncawait 获取和处理数据

setup函数中,你可以使用asyncawait来异步获取和处理数据。

<script setup>
import { ref } from 'vue';

const data = ref(null);

async function fetchData() {
  const response = await fetch('your-api-url');
  const result = await response.json();
  // 处理数据
  data.value = result.map(item => ({
    ...item,
    processed: true
  }));
}

fetchData();
</script>

通过这些方法,你可以在Vue 3中灵活地在渲染前处理数据,确保组件正确地显示和使用数据。

  1. 图片优化:
import Image from 'next/image'

// 使用 Next.js 的 Image 组件替换普通 img 标签
export function OptimizedImage({ src, alt, ...props }) {
  return (
    <Image
      src={src}
      alt={alt}
      loading="lazy"
      placeholder="blur"
      blurDataURL="data:image/jpeg;base64,/9j/4AAQSkZJRg..."
      {...props}
    />
  )
}
  1. 组件懒加载:
// 将非首屏组件改为懒加载
import dynamic from 'next/dynamic'

const DashboardChart = dynamic(() => import('./DashboardChart'), {
  loading: () => <p>Loading...</p>,
  ssr: false  // 如果组件不需要服务端渲染
})
  1. 路由预加载:
import { useRouter } from 'next/router'
import Link from 'next/link'

export function Navigation() {
  const router = useRouter()
  
  return (
    <Link 
      href="/dashboard"
      onMouseEnter={() => router.prefetch('/dashboard')}
    >
      仪表盘
    </Link>
  )
}
  1. 优化字体加载:
import { Inter } from 'next/font/google'
 
const inter = Inter({
  subsets: ['latin'],
  display: 'swap',
  preload: true,
})
  1. 添加缓存策略:
import { unstable_cache } from 'next/cache';

export const fetchInvoices = unstable_cache(
  async () => {
    // 数据库查询逻辑
  },
  ['invoices-cache'],
  {
    revalidate: 3600, // 1小时后重新验证
    tags: ['invoices']
  }
)
  1. 优化 API 请求:
// 使用 SWR 进行数据请求和缓存
import useSWR from 'swr'

export function useInvoices() {
  const { data, error } = useSWR('/api/invoices', fetcher, {
    revalidateOnFocus: false,
    revalidateOnReconnect: false
  })
  return { data, error }
}
  1. 添加页面元数据优化:
export const metadata = {
  metadataBase: new URL('https://your-site.com'),
  alternates: {
    canonical: '/',
  },
  openGraph: {
    title: '您的网站',
    description: '网站描述',
  }
}
  1. 配置构建优化:
/** @type {import('next').NextConfig} */
const nextConfig = {
  compress: true,
  poweredByHeader: false,
  reactStrictMode: true,
  compiler: {
    removeConsole: process.env.NODE_ENV === 'production',
  },
  experimental: {
    optimizeCss: true,
  },
}

module.exports = nextConfig

其他建议:

  1. 服务端优化:
  • 使用 CDN 分发静态资源
  • 启用 Gzip/Brotli 压缩
  • 配置适当的缓存策略
  1. 代码分割:
  • 合理使用动态导入
  • 避免不必要的大型依赖包
  • 使用 bundle 分析工具优化包大小
  1. 性能监控:
export function reportWebVitals(metric) {
  if (metric.label === 'web-vital') {
    console.log(metric) // 发送到分析服务
  }
}
  1. 预连接关键域名:
<link rel="preconnect" href="https://your-api-domain.com" />
<link rel="dns-prefetch" href="https://your-api-domain.com" />
  1. 使用 Service Worker:
self.addEventListener('install', (event) => {
  event.waitUntil(
    caches.open('v1').then((cache) => {
      return cache.addAll([
        '/',
        '/styles/main.css',
        '/scripts/main.js',
      ])
    })
  )
})

实施这些优化后,建议:

  1. 使用 Lighthouse 进行性能测试
  2. 监控实际用户性能指标
  3. 根据分析数据持续优化
  4. 考虑使用 Next.js 的 ISR 或增量静态再生成
  5. 实施渐进式加载策略

这些优化措施可以显著提升网站的首次加载性能。需要根据具体项目情况选择合适的优化方案。

宝塔续签证书,出现旧的或者已经删除的域名,导致续签失败

解决方法:宝塔目录找到/www/server/panel/class下的acme_v2.py文件59-61行zuo

_dnsapi_file = 'config/dns_api.json'
_save_path = 'vhost/letsencrypt'
_conf_file = 'config/letsencrypt.json'

根据这三个地址找文件,根本解决方案在/www/server/panel/config/letsencrypt.json文件,也就是第三个,找到

"auth_type": "http", "domains": ["错误的域名.net", ...其他域名], 

删除掉错误域名保存重新续签即可

React 提供了一系列的 Hook,允许你在函数组件中使用状态和其他 React 特性,而无需编写类组件。以下是一些常用的 React Hook:

  1. useState:用于在函数组件中添加状态。它让你能够拥有可变状态和副作用。

    const [state, setState] = useState(initialState);
  2. useEffect:用于在函数组件中执行副作用操作。它可以模拟生命周期方法,如 componentDidMountcomponentDidUpdatecomponentWillUnmount

    useEffect(() => {
      // 副作用逻辑
      return () => {
        // 可选的清理逻辑
      };
    }, dependencies); // 依赖数组
  3. useContext:允许你订阅 context,这样在组件树渲染时,任何 context 的变化都可以被组件感知到。

    const contextValue = useContext(MyContext);
  4. useReducer:当你需要更复杂的状态逻辑时,可以使用 useReducer 来代替 useState。它接收一个 reducer 函数和初始状态,并返回当前状态和一个 dispatch 函数。

    const [state, dispatch] = useReducer(reducer, initialState);
  5. useMemo:用于执行记忆化的计算。只有当依赖项变化时,才会重新计算。

    const memoizedValue = useMemo(() => expensiveComputation(a, b), [a, b]);
  6. useCallback:返回一个 memoized 的回调函数,只有当依赖项变化时,回调函数才会更新。

    const memoizedCallback = useCallback(() => {
      // 回调逻辑
    }, [dependency1, dependency2]);
  7. useRef:创建一个可变的 ref 对象,其 .current 属性被保留在组件的整个生命周期中。

    const refContainer = useRef(initialValue);
  8. useImperativeHandle:当你使用 forwardRef 将 ref 传递到可转发的组件时,你可以使用 useImperativeHandle 来自定义暴露给父组件的 ref 对象。

    useImperativeHandle(ref, () => ({
      // 暴露给父组件的 API
    }));
  9. useLayoutEffect:与 useEffect 类似,但它会在所有的 DOM 变更之后同步触发。这对于需要在浏览器绘制前执行的 DOM 读取操作是必要的。

    useLayoutEffect(() => {
      // 副作用逻辑
    }, dependencies);
  10. useDebugValue:这个 Hook 可以在 React 开发者工具中显示标签,帮助你调试 Hook。

    useDebugValue(value);
  11. useTransition:用于控制状态变化时的性能优化,它可以延迟状态更新引起的渲染。

    const [startTransition, isPending] = useTransition({
      timeoutMs: 3000,
    });
  12. useDeferredValue:允许你在异步渲染期间使用之前渲染的值,而不是等待当前渲染的值。

    const deferredValue = useDeferredValue(value, { timeoutMs: 3000 });
  13. useId:创建一个唯一的 ID,可以用于 DOM 元素的属性。

    const id = useId();
  14. useInsertionEffect:与 useEffect 类似,但它会在组件插入到 DOM 后触发,而不是在每次渲染后。

    useInsertionEffect(() => {
      // 副作用逻辑
    }, dependencies);
  15. useAnimation:用于动画化值,它提供了一个声明式 API 来控制动画。

    const [animatedValue, setAnimatedValue] = useAnimation();

这些 Hook 使得函数组件可以处理原本需要类组件来实现的复杂交互和状态逻辑。通过组合使用这些 Hook,你可以构建功能丰富且高效的组件。

linux查找文件夹中全部特定日期的文件

在Linux中,你可以使用find命令结合-newermt和-not -newermt测试来查找特定日期的文件。这里是一个例子,假设你想找到在特定日期2023-04-01创建或修改的所有文件:

find /path/to/folder -newermt '2023-04-01' ! -newermt '2023-04-02'

这个命令会找出在2023-04-01当天创建或修改的所有文件,但不包括2023-04-02之前的文件。

解释:

/path/to/folder 是你想要搜索的目标文件夹路径。

-newermt '2023-04-01' 查找修改时间在给定日期之后的文件。

! -newermt '2023-04-02' 排除在给定日期之后的文件,这里是2023-04-02,从而只保留在2023-04-01当天的文件。

确保你的find命令支持-newermt参数。如果不支持,你可能需要使用-newer和-mtime参数的组合来实现类似的功能。