所选图像未显示在画布上

2024-01-09

我正在开发一个应用程序,用户可以从提供的图像列表中选择图像。当用户单击列表中的图像时,所选图像应作为背景显示在画布上。我正在使用reactjs、redux 和fabricjs 开发它。

当我这样做时,我没有得到选定的图像 this.props.getSelectedImage.image.image 这样我就可以更新 设置画布背景。

图像列表.js

class Images extends React.Component {
  renderImages() {
    const { images, selectImage } = this.props;
    return _.map(images, (image, key) =>
      <li key={key}>
        <img
          src={image.image}
          alt={image.id}
          className="responsive-img default-images"
          width="400px"
          onClick={() => selectImage(image)}
        />
      </li>
    );
  }
  render() {
    return (
      <ul className="image-list">
        {this.renderImages()}
      </ul>
    );
  }
}

const mapStateToProps = (state) => {
  return {
    images: state.images
  }
};

const mapDispatchToProps = (dispatch) => {
  return bindActionCreators({ selectImage: selectImage }, dispatch);
}

export default connect(mapStateToProps, mapDispatchToProps)(Images);

动作.js

export function selectImage(image) {
  return {
    type: 'SELECT_IMAGE',
    payload: image
  }
}

减速器.js

const initialState = {
  selectedImage: require('./img/image1.jpg')
};

export function getSelectedImage(state = initialState, action) {
  switch (action.type) {
    case 'SELECT_IMAGE':
      return Object.assign({}, state, { selectedImage: action.payload.image })
    default:
      return state;
  }
}

图像板.js

class ImageBoard extends React.Component {
  constructor() {
    super();
    this.state = {
      canvas: undefined,
      selected: undefined
    };
  }

  componentDidMount() {
    const canvas = new fabric.Canvas('canvas');
    this.setCanvasBackground(this.props.getSelectedImage.selectedImage, canvas);
  }

  setCanvasBackground(image, canvas) {
    canvas.setBackgroundImage(image, function(e) {
    let iw = canvas.backgroundImage.width,
          ih = canvas.backgroundImage.height,
          cw = canvas.getWidth(),
          ch = canvas.getHeight();

    let iar = iw/ih,
      car = cw/ch;

    let nw = cw,
      nh = ch;

    if (iar > car){
      nh = ch;
      nw = nh * iar;
    }
    else if (iar < car){
      nw = cw;
      nh = cw/iar;
    }
    canvas.backgroundImage.width = nw;
    canvas.backgroundImage.height = nh;
    canvas.renderAll();
    }.bind(this));
  }

  render() {
    return(
      <div className="image-board">
         <canvas
           id="canvas"
           className="z-depth-1"
           width={600}
           height={400}
         />
      </div>
    );
  }
}

const mapStateToProps = (state) => {
  console.log('state', state);
  return {
    images: state.images,
    getSelectedImage: state.getSelectedImage
  }
};

export default connect(mapStateToProps)(ImageBoard);

现在我可以显示默认图像,但当单击列表中的图像时无法更改画布中的背景图像。但是当我放置console.log('image selected', this.props.getSelectedImage.image.image);在渲染函数内,我获取了选定的图像,但无法在 setBackgroundImage 上设置它,因此我可以在画布上显示选定的图像。

我怎样才能这样做?

已使用react v15.4.2

UPDATE

componentDidUpdate() {
    console.log('componentDidUpdate');
    const canvas = new fabric.Canvas('canvas');
    this.setCanvasBackground(this.props.getSelectedImage.selectedImage, canvas);
  }

如果我使用 componentDidUpdate 生命周期方法,它可以工作,但我得到以下结果。重新创建了很多画布,我知道它是因为我在 componentDidUpdate 中创建了一个画布对象来更新画布。我怎样才能清楚地做到这一点?


我看到两个可能的解决方案:

  • 从 DOM 中删除旧画布(这样你就只有新画布):

如何销毁/重新加载 html 5 中的画布? https://stackoverflow.com/questions/18456160/how-to-destroy-reload-the-canvas-in-html-5

componentDidUpdate() {
    console.log('componentDidUpdate');
    // Get the old canvas and remove it
    var oldCanvas = document.getElementById('canvas');
    oldCanvas = null;

    // Add your completely new canvas
    const canvas = new fabric.Canvas('canvas');
    this.setCanvasBackground(this.props.getSelectedImage.selectedImage,      canvas);
}
  • 在重新绘制新画布之前清除旧画布:

使用 Javascript 在 HTML5 中重绘 Canvas https://stackoverflow.com/questions/11773811/redrawing-canvas-in-html5-using-javascript

要清除画布,您需要执行上面链接中提到的操作。如果您使用此方法,请确保不要在 componentDidUpdate() 中向页面添加新画布。

    var canvas = document.getElementById("canvas");
    var ctx = canvas.getContext("2d");
    ctx.clearRect(0, 0, 500, 500);

第二个解决方案的链接特别提到,如果您不清除画布,则绘制的元素将堆叠。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

所选图像未显示在画布上 的相关文章

随机推荐

  • 逐步从 SQL Server 迁移到 PostgreSQL

    公司有许多应用程序在 SQL Server 上运行 数据库有点乱 目标是逐步从 SQL Server 迁移到 PostgreSQL 不能选择另一个 SQL Server 实例 理想的情况是新应用程序可以连接到 PostgreSQL 创建新的
  • 如何在 vuejs 中基于类的组件中编写计算设置器

    我有以下计算属性的代码 computed filterText get return this filter it s a vuex state set value this setFilter value it s a vuex acti
  • Linux 上的多处理进程终止失败

    我刚刚注意到进程终止的问题 来自multiprocessingLinux 上的库 方法 我有应用程序正在使用multiprocessing图书馆但是 当我打电话时terminateWindows 上的功能一切正常 但 Linux 上的这个解
  • 有关在 Apache Tomcat 中运行的 Web 应用程序中查找内存泄漏的建议

    我有一个 Axis2 Web 服务 它刚刚在客户端站点上崩溃 它抛出以下异常 java lang OutOfMemoryError 无法创建新的本机线程 我只是将日志从网站上拉下来 但在此期间我想知道是否有人知道我可以使用任何监视工具来查找
  • 我的 JProgressBar 直到 100% 才更新

    好的 我有以下代码 public class MyProgressBar extends JPanel implements MyData Serializable public static final int MAX 10000 pub
  • Android Webview 与 KitKat 4.4

    我正在尝试使用 KitKat 4 4 将网站移植到 Android 平板电脑 WebView vendWebView WebView findViewById R id webview WebSettings webSettings ven
  • FBSDKLoginManager logInWithReadPermissions?

    我在用着FBSDKLoginButton允许用户使用登录Facebook并使用FBSDKLoginButton readPermissions public profile email user likes email user birth
  • 如何进行 knex.js 迁移?

    我仍然不确定如何使用 knex 进行迁移 这是我到目前为止所拥有的 它适用于up but down即使foreign key checks 0 也会给我FK约束错误 exports up function knex Promise retu
  • Android中如何获取经纬度

    如果 GPS 不可用 如何从移动设备获取纬度和经度 我的手机通过 wifi 和 gprs 连接有互联网连接 我们可以从中获取纬度和经度吗 edited 网络和 GPS 提供商位置 https stackoverflow com questi
  • 有没有办法在Python中强制函数参数互斥?

    考虑 def foobar foo bar if foo print foo end if bar print bar end if foo and bar print No bueno end I want this to be impo
  • Lamport同步算法讨论中的“偏序”和“全序”是什么意思?

    我的理解是 部分排序和全排序是两组规则 部分排序有三个规则 1 如果a和b是同一进程中的两个事件 并且a出现在b之前 则a gt b 2 3 那什么是全序呢 为何如此命名 这些名称源于这样一个事实 在部分顺序中 并非所有元素都具有可比性 而
  • Solr 5.1:Solr 创建了太多日志文件

    我正在处理 Solr 5 1 创建太多日志文件的问题 每次 Solr 重新启动时 以及一周定期重新启动时 Solr 都会创建以下文件 我需要它停止 solr gc xxxxxxxx xxxx 类型的文件 其中 x 分别代表日期和某种标识号
  • php中带有多个条件的if语句

    我有多个条件的 if 语句 这两个条件有什么区别 1 if province AB NT NU YT GST 5 else if province BC MB GST 5 PST 7 else if province NB NF ON HS
  • 如何让Mysql数据库支持阿拉伯语?

    我试图将阿拉伯语保存在 mysql 数据库中 但它不以阿拉伯语格式保存 它显示问号而不是阿拉伯语 如何让它用阿拉伯语存储值 我尝试了很多从互联网上看到的查询 但它没有改变 如何将其更改为阿拉伯语 ar SA 阿拉伯语 沙特阿拉伯 请建议一个
  • 如何使用 jQuery 搜索嵌套列表?

    我已经将一个简单的搜索字段放在一起来浏览列表 但我有嵌套列表 并且它仅限于单级列表 如何修改 我把它放在小提琴里 http jsfiddle net marksweb 4CJMe http jsfiddle net marksweb 4CJ
  • 如何将 CakePHP 中的查找限制为特定数量?

    我有一个用户模型 它为我提供最新的用户作为输出 如何限制记录只输出 200 条记录而不是数据库中的所有用户 根据文档 http book cakephp org 2 0 en models retrieving your data html
  • node.js - 如何使用服务工作者缓存handlebars.js

    我想问一下服务人员的情况 我制作了一个网络应用程序并尝试实现服务工作者 我使用 hbs 作为视图布局 当我缓存静态文件时 我无法缓存 hbs css 和 js 文件 这就是我保存文件的方式 public css style css js a
  • 如何从另一个函数返回生成器

    我有一个生成器函数 我想从另一个函数调用它并返回获得的生成器 我在这里可以看到两种方法 请注意 以下函数是简单的虚拟函数 用于说明目的 请不要想出更好的方法来实现这些功能本身 Method 1 def fun a n for i in ra
  • 如何制作热图并使用 NA 值进行聚类?

    我正在尝试使用我的数据制作热图 但很难正确编码 我的矩阵充满了 log x 1 值 这样我就不会遇到 log 0 错误 但是由于数据的性质 我有一堆 0 值 它们掩盖了热图的任何趋势可能正在展示 因此 我想将任何 0 值着色为灰色或黑色 然
  • 所选图像未显示在画布上

    我正在开发一个应用程序 用户可以从提供的图像列表中选择图像 当用户单击列表中的图像时 所选图像应作为背景显示在画布上 我正在使用reactjs redux 和fabricjs 开发它 当我这样做时 我没有得到选定的图像 this props