# image-editor **Repository Path**: nanfuyun/image-editor ## Basic Information - **Project Name**: image-editor - **Description**: 图片编辑 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-07-06 - **Last Updated**: 2022-10-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 图片编辑器 ## 实现逻辑 先将各种标签写好,然后循环遍历组件属性列表formDataList,根据其中的type来显示对应的标签,根据其中的键值来绑定form ## 使用的组件 1. 生成uuid:uuid 2. 缩放拖拽:vue-draggable-resizable-gorkys 3. 生成二维码:vue-qr 4. 日期格式化:moment.js 5. 图片预览:vue-preview-img 6. 代码高亮:vue-highlightjs 7. 一键复制:vue-clipboard2 ## 遇到的问题 1. 子组件向父组件用$emit传值时,父组件`@dialogCancel="dialogCancel"`接收时不能加(),因为不是类似`@click="click()"`这样的方法 2. `@click="popupDialog($event,'create')" `使用`$event`来占位,同时调用方法可以保留e 3. dialog隐藏后不会触发`monted()`刷新数据,可以用`v-if`控制dialog的显示,`v-if`会销毁组件,因此每次打开dialog都是重新创建,触发`monted()` 4. 可点击的div里的小按钮要用`@click.stop=click()`停止冒泡 5. 给标签设置`ref='ref'`,然后`this.$refs.ref`可以获得`document.getElementById`的效果,后面也能进行dom操作,如`this.$refs.ref.children`获得子组件列表、`this.$refs.ref.focus()`聚焦组件 6. 组件拖拽的`div`的层级结构: (1) 外层`div` (2) 画布`div`:使用用户上传的图片做`background-image`的`div`,为了作为拖拽组件的父级,需要设置`position: relative;` (3) ` v-for`循环组件的`div`:在这一层添加键盘事件 (4) 使用拖拽缩放组件的层级:使用组件`vue-draggable-resizable-gorkys:`,在这里设置`tabindex="0" ` (5) 根据循环列表的`type`显示对应的组件 7. 想要让`div`能被聚焦选中和用tab键选中,需要给`div`设置`tabindex='0'` 8. 拖拽层和组件层的定位和宽高要相等,循环层可以不设置位置宽高 9. 给父div设置`transform: scale(1);`,可以让子`div`使用`position:fix;`时基于父组件来定位。而不是根据浏览器的可视区域定位 10. `:style`可以用计算属性来时时改变,如果要传参,如`:style= "imageStyle(item)"`,需要在计算属性返回一个方法,用这个方法接收参数 ```javascript textStyle() { return function(item) { return { width: item.positionAndSize.w + 'px', } } }, ``` 11. 边框圆角需要`style="borderRadius:50%;"` 12. **给组件设置`:key=index`后,如果`index`改变,会重新渲染组件** 13. div缩放可以使用`transform: scale(1)`或`zoom:1` `transform`不会改变`div`所占区域大小,只改变内容大小,`zoom`会改变`div`所占区域的大小,`zoom`不能在火狐浏览器用 14. 封装`el-dialog`: https://blog.csdn.net/web_wp/article/details/124967512 15. **vueX的使用** (1) 在`store`文件夹的`index.vue`中:`state`定义数据,`mutations`定义方法 ```javascript export default new Vuex.Store({ state: { counter:'', scale:0.5, scaleNew:0.5, baseURL: 'http://poster.ixz.huaihai.tv/', }, mutations: { changeScale(state,scale){ state.scale = scale } }, ``` (2) 在`.vue`文件的`