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

React Gutenberg自定义区块视频src更新后如何实现用户立即可见?

问题原因

HTML5 <video> 元素的src属性变更不会被浏览器自动识别为资源更新信号,仅通过React虚拟DOM更新属性不会触发视频资源重载,因此会出现src已更新但编辑区预览无变化的问题。

实现代码

依赖导入

import { useRef, useEffect } from '@wordpress/element';
import { MediaUpload, MediaUploadCheck } from '@wordpress/block-editor';
import { Button } from '@wordpress/components';

编辑模块核心逻辑

// 需提前在block.json的attributes字段中声明videoUrl属性:
// "videoUrl": { "type": "string", "default": "" }
const Edit = ( { attributes, setAttributes } ) => {
    const { videoUrl } = attributes;
    // 创建ref绑定video DOM元素
    const videoRef = useRef( null );

    // 监听videoUrl变更,主动触发视频资源重载
    useEffect( () => {
        if ( videoRef.current && videoUrl ) {
            videoRef.current.load();
            // 可选:编辑区静音自动播放,规避浏览器自动播放策略限制
            // videoRef.current.play().catch( () => {} );
        }
    }, [ videoUrl ] );

    return (
        <div className="custom-video-block">
            { videoUrl && (
                <video 
                    ref={ videoRef }
                    src={ videoUrl }
                    controls
                    muted
                    style={ { width: '100%' } }
                />
            ) }
            <MediaUploadCheck>
                <MediaUpload
                    onSelect={ ( media ) => setAttributes( { videoUrl: media.url } ) }
                    allowedTypes={ [ 'video' ] }
                    render={ ( { open } ) => (
                        <Button onClick={ open } variant="primary">
                            { videoUrl ? '更换视频' : '选择上传视频' }
                        </Button>
                    ) }
                />
            </MediaUploadCheck>
        </div>
    );
};

注意事项

  • 所有视频地址的变更必须通过setAttributes更新区块属性,禁止直接操作DOM修改src,否则会出现区块状态与视图不同步的问题
  • 如果你使用<source>子标签配置视频地址,逻辑无需调整,依然调用外层video元素的load()方法即可生效
  • 如遇跨域预览异常,确认视频资源和WordPress后台域名一致,或资源配置了正确的CORS访问头

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 21:24:04