7

我正在使用react-dropzone来允许用户上传个人资料照片。

我像这样定义自定义 CSS:

const dropzoneStyle = {
  width: `200px`,
  height: `200px`,
  backgroundColor: `#1DA1F2`,
};

在呈现 DropZone 输入的方法中,我可以检测它们是否是在用户选择要上传的图像后填充的文件预览。

我想要做的是,如果 file.preview 存在,则将 file.preview 发送到 dropzoneStyle,以便将背景图像添加到 CSS 中。

const renderDropzoneInput = (field) => {
  const files = field.input.value;
  let dropzoneRef;

  if (files[0]) {
    console.log(files[0].preview)
  }

  return (
    <div>
      <Dropzone
        name={field.name}
        ref={(node) => { dropzoneRef = node; }}
        accept="image/jpeg, image/png"
        style={dropzoneStyle}
      >

如何files[0].preview使用 React 传递给样式 dropzoneStyle?

4

2 回答 2

12

我通常只是将样式定义为返回样式对象的箭头函数,并传入样式所需的任何参数。有一个从箭头函数返回对象字面量的简写符号,可以很好地实现这一点。

const style = () => ({});

请记住,如果使用速记,则仅使用三元运算符,否则您只需要显式地显示return一个对象。

所以,对于你的风格:

const dropzoneStyle = (isPreview) => ({
  width: `200px`,
  height: `200px`,
  backgroundColor: `#1DA1F2`,
  backgroundImage: (isPreview) ? 'url(/path/to/image.jpg)' : 'none',
});

这增加了图像是isPreview真实的,但如果不是,则保持空白。

然后在您的组件中,调用样式所在的函数:

return (
  <div>
    <Dropzone
      {...otherProps}
      style={ dropzoneStyle(isPreview) }
    >
  </div>
);
于 2017-06-26T02:07:35.437 回答
9

假设files[0].preview返回一个文件(图像) URL,您应该能够设置新样式并将其传递给Dropzone组件。

这些方面的东西:

const renderDropzoneInput = (field) => {
  const files = field.input.value;
  let dropzoneRef;

  render() {
    let dropzoneStyle = {
      width: `200px`,
      height: `200px`,
      backgroundColor: `#1DA1F2`,
    };

    if (files[0]) {
      dropzoneStyle = {
        width: `200px`,
        height: `200px`,
        backgroundColor: `#1DA1F2`,
        backgroundImage: `url(${files[0].preview})`,
        // or to use a fixed background image
        // backgroundImage: `url(/path/to/static/preview.png)`,
        backgroundPosition: `center center`,
        backgroundRepeat: `no-repeat`
      };
    }

    return (
      <Dropzone
        name={field.name}
        ref={(node) => { dropzoneRef = node; }}
        accept="image/jpeg, image/png"
        style={dropzoneStyle}
      />
    )
  }
}  

扩展运算符可用于稍微干燥此代码,其中:

let dropzoneStyle = {
  width: `200px`,
  height: `200px`,
  backgroundColor: `#1DA1F2`,
};

if (files[0]) {
  dropzoneStyle = {
    ...dropzoneStyle,
    backgroundImage: `url(/path/to/static/preview.png)`,
    backgroundPosition: `center center`,
    backgroundRepeat: `no-repeat`
  };
}
于 2017-06-26T02:06:51.523 回答