You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js表单提交后如何在JSX中渲染缩短后的URL

解决Next.js中无法渲染短链接result.target的问题

核心问题分析

你遇到的报错本质是**result变量未初始化或未正确更新状态**,导致渲染时访问result.target时result为undefined。以下是具体修复步骤和代码示例:

修复步骤

1. 初始化组件状态

在Home组件中用useState初始化result状态,初始值设为null或空对象,避免未定义的情况:

const [result, setResult] = useState(null);

2. 正确处理异步表单提交

生成短链接是异步操作,必须用async/await确保拿到结果后再更新状态,避免状态更新不及时:

const handleSubmit = async (values) => {
  try {
    // 等待短链接生成结果
    const shortenedResult = await shortener.generate(values.url);
    // 将结果存入组件状态
    setResult(shortenedResult);
    // 可打印结果确认结构是否包含target字段
    console.log('生成结果:', shortenedResult);
  } catch (error) {
    console.error('生成失败:', error);
  }
};

3. 条件渲染避免报错

渲染result.target前必须判断result是否存在,防止初始状态或请求未完成时访问不存在的属性:

{result && (
  <div className="short-link-result">
    <p>生成的短链接:</p>
    <a href={result.target} target="_blank" rel="noopener noreferrer">
      {result.target}
    </a>
  </div>
)}

完整示例代码

import { useState } from 'react';
import { Formik, Form, Field } from 'formik';
import * as Yup from 'yup';
import { shortener } from '@studiohyperdrive/shortener';

export default function Home() {
  const [result, setResult] = useState(null);

  // Yup表单验证规则
  const urlValidationSchema = Yup.object({
    url: Yup.string()
      .url('请输入有效的URL地址')
      .required('URL不能为空'),
  });

  const handleFormSubmit = async (values) => {
    try {
      const shortenedData = await shortener.generate(values.url);
      setResult(shortenedData);
    } catch (err) {
      alert('短链接生成失败,请重试');
      console.error(err);
    }
  };

  return (
    <div className="container">
      <h1>URL短链接生成器</h1>
      <Formik
        initialValues={{ url: '' }}
        validationSchema={urlValidationSchema}
        onSubmit={handleFormSubmit}
      >
        {({ errors, touched }) => (
          <Form className="url-form">
            <Field
              name="url"
              type="url"
              placeholder="输入需要缩短的URL"
              className={`input-field ${errors.url && touched.url ? 'error' : ''}`}
            />
            {errors.url && touched.url && (
              <span className="error-message">{errors.url}</span>
            )}
            <button type="submit" className="submit-btn">生成短链接</button>
          </Form>
        )}
      </Formik>

      {/* 条件渲染结果 */}
      {result && (
        <div className="result-card">
          <h3>生成成功!</h3>
          <a 
            href={result.target} 
            target="_blank" 
            rel="noopener noreferrer"
            className="short-link"
          >
            {result.target}
          </a>
        </div>
      )}
    </div>
  );
}

额外排查点

  • 确认@studiohyperdrive/shortener返回的结果确实包含target字段,可在handleFormSubmit中console.log(shortenedData)查看结构。
  • 检查Formik的onSubmit是否正确绑定了处理函数,避免出现未触发状态更新的情况。

内容的提问来源于stack exchange,提问作者user16052347

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 06:00:20