【问题标题】:React JS Image Uploader | Change Background ImageReact JS 图片上传器 |更改背景图像
【发布时间】:2016-10-18 23:01:32
【问题描述】:

我正在尝试创建一个背景图像更新器/上传器组件。

图像是默认设置的,但是,如果用户想更新背景图像,我想更新状态并存储图像。

到目前为止的研究表明我需要使用<input type="file" /> 元素来启用上传对话框。

还有其他不使用输入元素的方法吗?如果用户要单击<button> 元素以显示对话框,然后更新背景图像。

export default class ChangeBackground extends React.Component {
    constructor() {
        super();
        this.state = {
            backgroundImage: ''
        }
    }

    handleBackgroundChange() {
        let backgroundImage = backgroundImage
        this.setState({
            backgroundImage: backgroundImage
        });
    }

    render() {
        return (
            <div className="change-bg-wrap">
                <input type="file" accept="image/*" />
                <button>
                    <i className="fa fa-picture-o" style={{fontSize: 20}}></i>
                </button>
            </div>
        )
    }
}

【问题讨论】:

    标签: javascript reactjs image-uploading


    【解决方案1】:

    display: "none"隐藏输入元素,然后做一些javascript,当点击按钮时会触发&lt;input&gt;

       triggerInput = () => {
            document.querySelector("input[type='file']").click();
        }
       <input type="file" accept="image/*" />
        <button onClick={this.triggerInput}>
            <i className="fa fa-picture-o" style={{fontSize: 20}}></i>
        </button>
    

    https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click

    也将 querySelector 值缓存在 var 中

    编辑:我认为您无法触发反应事件click(),这就是我使用原生 js 的原因。如果我错了,请纠正我。

    【讨论】:

    • 这个很好用,只需要弄清楚如何传递上传的图片来设置状态。
    • @Filth 在input 元素上尝试onChange 事件并将函数绑定到此回调。那么必须有办法检查文件进度是否已上传。我不知道在我的头上。 facebook.github.io/react/docs/forms.html
    【解决方案2】:

    修改了我之前的回答。我修改了一些位以使其适用于我的项目。请参阅下面的代码。

    class ChangeBackground extends React.Component {
        constructor() {
            super();
            this.state = {
                backgroundImage: 'START'
            }
    
            this.handleBackgroundChange = this.handleBackgroundChange.bind(this);
        }
    
        handleBackgroundChange(e) {
            const reader = new FileReader();
            const file = e.target.files[0];
    
            this.setState({
              backgroundImage: file.name,
            });
        }
    
        render() {
            return (
                <div className="change-bg-wrap">
                    <input onChange={this.handleBackgroundChange} type="file" accept="image/*" />
                    file: {this.state.backgroundImage}
                    <button>
                        <i className="fa fa-picture-o" style={{fontSize: 20}}></i>
                    </button>
                </div>
            )
        }
    }
    

    我添加了构造函数的最后一行来访问 setState。在 handleBackgroundChange 上,我添加了一个文件阅读器,您稍后可能想查看它,可以通过 e.target 访问文件。我在渲染函数上加了一行只是为了看看状态是否改变。

    这在我的项目中有效,如果它不适用于您的项目,请告诉我,我可以修改它。

    【讨论】:

    • 为什么一个新的FileReader 对象被实例化但从未使用过(在你的handleBackgroundChange 方法中)?
    • 我可能应该添加评论。如果您以后想通过文件传输将图像存储在后端,您可以使用它。在代码中,它仅适用于存储在字段中的图像。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 2015-10-14
    • 2012-10-16
    • 2014-03-04
    相关资源
    最近更新 更多