vue 를 사용 하여 자동 건설 프로젝트 를 어떻게 구축 합 니까?

15642 단어 vue세우다항목
앞 에 쓰다
그동안 Jquery+Jquery-ui 로 이 프로젝트 를 해 왔 는데,그 때 는 디자인 원고 도 없고,프로젝트 수요 도 없고,보스 한 마디 로 이런 걸 해 야 되 는데,그 때 는...그래!인정 합 니 다.사실은 익숙 해 졌 습 니 다.괜 찮 습 니 다.
그 후에 한 동안 demo 를 만 들 었 습 니 다.BOSS 는 매우 만 족 스 러 웠 습 니 다.그 러 니 다음 에 천천히 하 세 요.두 세 달 차이 가 나 지 않 아 요.그냥 묵묵히 이것 을 했 습 니 다.나중에 프로젝트 가 출시 되 었 습 니 다.물론 제품 이 완선 되 지 않 아서 문제 가 생 겼 습 니 다!
그러나 기본적으로 회사 의 수 요 를 만족 시 킬 수 있 습 니 다.편집 할 수 있 는 것 은 모두 편집 할 수 있 습 니 다.구성 요소 의 background(배경 그림 포함)color border box-shadow margin padding width height 정렬 방식(글꼴 과 구성 요소 내부 요소)border-radius font(font-size/font-family)등 기본 적 인 것 은 마음대로 변경 할 수 있 습 니 다.물론 회사 의 사용 을 만족 시 키 지 못 할 수도 있 습 니 다.사용자 정의 스타일 의 기능 을 추 가 했 습 니 다.이것 은 전단 을 아 는 사람 만 사용 할 수 있 습 니 다.어 쩔 수 없습니다.수 요 는 영원히 변 화 를 따라 가지 못 합 니 다.이렇게 안전 합 니 다.모두 가 알 고 있 기 때문에 수요 의 만족 과 변경 은 기 존의 수요 보다 영원히 앞 선다.
이러한 기본 적 인 변경 가능 을 제외 하고 각 구성 요소 의 특유 한 변경 가능 한 기능 도 기본적으로 완비 되 어 있다.예 를 들 어 윤 방도 이미지 변경,윤 방 방식,윤 방 여 부 를 제어 하 는 등 기능 은 여기 서 일일이 소개 하지 않 는 다.
그 후에 구성 요소 내부 의 개별 요 소 를 수정 할 수 없 기 때문에[바 인 딩 수정]기능 도 추 가 했 습 니 다.바로 이 기능 이 선택 한 후에 보기 인터페이스 에서 수정 해 야 할 요 소 를 선택 하면 수정 할 수 있 습 니 다.이 기능 은 약간 재 미 있 습 니 다.
이렇게 많은 말 을 했 습 니 다.사실은 그 당시 에 급 하 게 해서 저장 할 때 HTML 을 저 장 했 습 니 다.여러분 들 이 무시 하지 마 세 요.이것 도 제 마음 속 의 줄거리 입 니 다.최근 에 보스 가 다시 생각 을 했 습 니 다.더 해 야 할 것 이 많 습 니 다.곰 곰 이 생각 한 후에 프로젝트 를 재 구성 하기 로 결 정 했 습 니 다.
vue 응답 식 과 기본 이 순수 데이터 조작 임 을 고려 하여 vue 를 사용 하여 이 프로젝트 를 재 구축 하기 로 결정 하 였 습 니 다.
개발 준비
1.vue-cli 를 사용 하여 설정 한 것 을 다운로드 합 니 다.
2.중간 에 끌 어 당 겨 서 구성 요 소 를 만 드 는 작업 이 걸 려 있 기 때문에 vuedraggable 과 sortablejs 를 사 용 했 습 니 다.
vuedraggable sortablejs 설치

npm install vuedraggable
npm install sortablejs
프로젝트 에서 우 리 는 vuedraggable 만 도입 하면 됩 니 다.sortablejs 와 관련 이 있 을 때 vuedraggable 은 sortablejs 를 호출 하 는 방법 을 스스로 불 러 옵 니 다.이것 은 우리 가 관심 을 가 져 야 할 것 이 아 닙 니 다.(알 고 싶 으 면 직접 보 세 요)
3.vuex 를 설치 합 니 다.그 안에 대량의 데이터 상호작용 과 관련 되 기 때문에 많은 구성 요소 들 이 공용 데이터 가 필요 합 니 다.vuex 를 사용 하지 않 고 관리 하지 않 으 면 개발 에 더 많은 불필요 한 번 거 로 움 을 가 져 올 것 입 니 다.
vuex 설치

npm install --save vuex
4.디자인 원고 가 없 기 때문에 제3자 UI 라 이브 러 리 element-ui 를 과감하게 사 용 했 습 니 다.
element-ui 홈 페이지 주소
elememt 설치

npm install element-ui
//    element-ui   element?    npm     element  (           ,0.0    !!!)
5.axios 설치 후 배경 데이터 와 상호작용 할 때 사용 합 니 다.
axios 설치

npm install --save axios
하마터면 준비 작업 이 이 정도 일 뻔 했 으 니,이어서 우 리 는 프로젝트 의 실 시 를 보 자.
프로젝트 시작
1.각종 파일 의 설정
->main.js 에서 파일 설정

그림 에 해석 이 있어 서 알 수 있 을 거 예요.
->사 이 드 바 드래그 구성 요소 데이터 설정

파일 이 너무 길 기 때문에 일부 삭 제 했 습 니 다.여 기 는 간단 한 형식 입 니 다.참고 만 하고 기준 으로 하지 않 습 니 다.
구성 요소 에 레이아웃 문제 가 존재 하기 때문에 레이아웃 구성 요소 가 있어 야 구성 요소 가 레이아웃 구성 에 넣 을 수 있 습 니 다.그래 야 더욱 유연 합 니 다.
->vuexjs 상태 관리 중인 js 설정

설명:
1.사용자 가 드래그 한 후에 실시 간 으로 session Storage 에 저장 해 야 하기 때문에 초기 에 session Stroage 에서 데 이 터 를 찾 아야 합 니 다.갑자기 페이지 를 새로 고침 하 는 것 을 방지 하고 데이터 베이스 에 저장 되 지 않 았 습 니 다.사용자 가 방금 편집 한 데 이 터 를 모두 잃 어 버 린 경우 입 니 다.
2.여기 서 설명 하 겠 습 니 다.이미 제출 한 데 이 터 를 고려 하여 사용자 가 창 을 닫 은 후에 다시 들 어 올 때 배경 에서 제 시 된 사용자 의 이전 데 이 터 를 결합 하여 session Storage 에 저장 해 야 합 니 다.이 점 을 믿 고 여러분 이 생각 하 실 것 입 니 다.여기 서 선의 로 0.0 을 알려 드 립 니 다.
3.저 는 여기 서 네 개의 인 자 를 잠시 놓 았 습 니 다.그림 에서 설명 이 있 습 니 다.저 는 주로 기본 편집 을 하나의 구성 요소 로 만 들 었 습 니 다.사용자 가 클릭 할 때 어떤 구성 요소 에 따라 데 이 터 를 편집 구성 요소 에 다시 렌 더 링 하여 클릭 한 구성 요소 에 실시 간 으로 대응 하여 편집 할 수 있 습 니 다.
4.editShow 의 역할 은 편집 구성 요소 의 표시 여 부 를 제어 하 는 것 입 니 다.주로 구성 요 소 를 삭제 할 때 편집 구성 요 소 를 숨 깁 니 다.다른 구성 요소 의 표 시 를 클릭 하 십시오.
기본 적 인 배 치 는 여기까지 입 니 다.다음은 진정한 개발 입 니 다.
2.프로젝트 개발 시작
->app.vue 파일 에 어떻게 써 야 하나 요?

<template>
 <!--  element-ui-->
 <el-container>
  <el-aside>
   <Draggable class="app-aside-drag" :options="dragOption">
    <div class="app-aside-list" 
     v-for="(dragList,index) in dragData" 
     :type="dragList.type" 
     :key="dragList.type">
     <div class="aside-item-body">
      <i class="aside-item-ele"></i>
      <span class="aside-item-ele">{{ list.title }}</span>
     </div>
    </div>
   </Draggable>
  <el-aside>
  <el-main class="app-main">
   <section class="app-phone">
    <div class="app-phone-header">
     <span class="phone-camera"></span>
     <span class="phone-ls"></span>
    </div>
    <!--  view  -->
    <Sort class="app-phone-body"></Sort>
    <div class="app-phone-footer">
     <button class="app-phone-menu">RS</button>
    </div>
   </section>
  </el-main>
  <el-aside class="app-right">
   <!--      -->
   <BaseEdit></BaseEdit>
  </el-aside>
 </el-container> 
</template>

<script>
import DragApi from "@/dragapi/dragapi.js";
import Draggable from "vuedraggable";
import Sort from "@/view/Sort";
import BaseEdit from "@/view/BaseEdit";

export default {
 name: 'app',
 data(){
  return{
   dragData: {},
   dragOption: {
    group: {
     name: 'components', //     ,                 name      
     pull: 'clone', 
     put: false
    },
    sort: false //   true。          ,       
   }
  }
 },
 components: {
  Draggable,
  Sort,
  BaseEdit
 },
 created(){
  //         
  //             ,       
  this.dragData = DragApi.configList[1].content;
 }
}
</script>
->sort view 보기 영역 구성 요소 살 펴 보기

<template>
 <Draggable :options="sortOption"
  @sort="onSort"
  @add="onAdd"
  class="app-sort">
  <!-- ui   -->
  <!--      ,   vue        -->
  <div v-for="(appUi,index) in sortApi" //    
    :is="appUi.component" //           
    :content="appUi.content"
    :oStyle="appUi.style"
    :editPartShow="appUi.editPartShow"
    :aIndex="index"
    //        ,   @click.native   
    @click.native="getIndex(index)"
    //key       ,               
    :key="appUi.content.code">
  </div>
 </Draggable>
</template>
<script>
 //  vuex        vuexjs    
 import { mapState,mapMutations } from 'vuex';
 //      
 import Draggable from 'vuedraggable';
 //      
 import Carousel from "@/components/Carousel.vue";
 import Btn from "@/components/Btn.vue";

 export default {
  name: 'Sort',
  components: {
   Draggable,Btn,Carousel
  },
  data(){
   return {
    sortOption: {
     group: {
      name: 'components', //    name,        ,   ,      
      pull: true,
      put: true
     },
     sort: true,
     animation: 300 //     ,      
    }
   }
  },
  computed:{
   ...mapState(['editIndex','sortApi']),
  },
  watch:{
   sortApi:{
    handler(newVal,oldVal){
     window.sessionStorage.setItem('localData',JSON.stringify(newVal));
    },
    deep: true
   }
  },
  methods:{
   ...mapMutations(['sortCp','addCp','setStyle','setCommon']),
   onSort(res){ //       
    if(res.from === res.to){
     this.sortCp(res);
    }
   },
   onAdd(res){//         
    this.addCp(res);
   },
   getIndex(index){
    this.setCommon({index: index,flag: true});
   }
  }
 }
</script>
->편집 구성 요소 다시 보기

<template>
 <transition name="slide-right">
  <div v-if="sortApi.length > 0 && editShow === true">
   //      
   <el-tabs v-model="activeName">
    <el-tab-pane label="    " name="first">
     <div v-for="(appUi,index) in sortApi"
       :is="appUi.component+'Edit'"
       :content="appUi.content"
       :oStyle="appUi.style"
       :editPartShow="appUi.editPartShow"
       :aIndex="index"
       :currentIndex="editIndex"
       :key="appUi.content.code">
     </div>
    </el-tab-pane>
    <el-tab-pane label="    " name="second">
     //      
     <el-collapse v-model="colorPicker.name" class="base-edit" accordion>
      <el-collapse-item class="tititt" :title="colorPicker.type" :name="colorPicker.type">
       <el-form ref="form" :model="colorPicker" size="mini">
        <el-form-item class="cui-inline-reset"
         v-for="(item,index) in colorPicker.content"
         :label="item.title"
         :key="item.style">
         <el-color-picker
          // element-ui   ,   @change @active-change  ,             ,
          //  ,       ,             ,          
          //                  
          //            style
          @active-change=" (value) => setStyle(value,item.style)"
          v-model="sortApi[editIndex].style[item.style]"
          show-alpha>
         </el-color-picker>
         <span class="black-text-shadow"
          :style="{color: sortApi[editIndex].style[item.style]}">
          {{ sortApi[editIndex].style[item.style] }}
         </span>
        </el-form-item>
       </el-form>
      </el-collapse-item>
     </el-collapse>
    </el-tab-pane>
   </el-tabs>
  </div>
 </transition>
</template>
<script>
 import { mapState,mapMutations } from 'vuex';
 //            ,       ,              ?
 //        ,          ,            ,   dom         ,       
 //      
 import BtnEdit from "@/components/BtnEdit.vue";
 
 export default{
  name: 'BaseEdit',
  components: {
   BtnEdit
  },
  data(){
   return{
    colorPicker: {
     type: '    ',
     name: 'Picker',
     content:[
      {
       title: '    ',
       style: 'background'
      },
      {
       title: '    ',
       style: 'color'
      }
     ]
     
    },
    activeName: 'first'
   }
  },
  
  computed:{
   ...mapState(['editIndex','sortApi','editShow'])
  },
  methods:{
   setStyle(value,style){
    //       style  ,        
    this.$set(this.sortApi[this.editIndex].style,style,value);
   }
  }
 }
</script>
->구성 요 소 를 선택 하여 안에 어떻게 설정 되 어 있 는 지 살 펴 봅 니 다.

//    ,       
//          ,           ,      
<template>
 <div class="btn-box ui-sortable" :data-code="content.code">
  <el-button class="ui-btn"
   :style="oStyle">
   {{ content.text }}
  </el-button>
  //            ,         
  <DeleteCp :aIndex="aIndex"></DeleteCp>
 </div>
</template>
<script>
 import DeleteCp from "@/components/DeleteCp";
 export default {
  name: 'Btn',
  props: { //        
   content: Object,
   oStyle: Object,
   aIndex: Number
  },
  components: {
   DeleteCp
  },
  data(){
   return{
    btnModel: 'btn-model'
   }
  }
 }
</script>
->마지막 으로 삭제 구성 요 소 를 살 펴 보 자

<template>
 <div class="delete-compontent-box">
  <div class="el-icon-delete remove-component" @click.stop="dailogStatu"></div>
  <el-dialog
   title="  "
   :visible.sync="dialogVisible"
   :append-to-body="appendToBody"
   width="430px">
   <div class="el-message-box__content">
    <div class="el-message-box__status el-icon-warning"></div>
    <div class="el-message-box__message dialog-message">         ,     ?</div>
   </div>
   <span slot="footer" class="dialog-footer">
    <el-button @click="dialogVisible = false" size="small">   </el-button>
    <el-button type="primary" @click="onRemove(aIndex)" size="small">   </el-button>
   </span>
  </el-dialog>
 </div>
</template>

<script>
 import { mapMutations } from "vuex";
 export default {
  name: 'oText',
  props: {
   aIndex: Number
  },
  data(){
   return{
    //           
    dialogVisible: false,
    appendToBody: true 
   }
  },
  methods:{
   ...mapMutations(['deleteCp','setCommon']),
   dailogStatu(){
   //         ,             
    this.dialogVisible = true;
    this.setCommon({flag: true,index: this.aIndex})
   },
   onRemove(index){
    //           
    let flag = false;
    this.deleteCp(index);
    this.dialogVisible = false;
    this.$message({
     message: '       !',
     type: 'success'
    });
    this.setCommon({flag: false,index: 0})
   }
  }
 }
</script>
->효과 도 를 살 펴 보 자
효과 도 전시

종결 어
자,오늘 많이 썼 습 니 다.마지막 으로 생각 을 정리 하 겠 습 니 다.
1,우선 왼쪽 드래그 구성 요소 설정
2.vuex 의 데이터 설정
3.app.vue 설정
4.구성 요소 의 설정 편집
5.각종 데이터 의 전달 과 의존
사실 모든 프로젝트 는 뚜렷 한 노선 이 필요 합 니 다.그래 야 잘 개발 할 수 있 습 니 다.그래서 제 제안 은 프로젝트 를 받 을 때 한꺼번에 쓰 지 말고 어떻게 하 는 지,그리고 돌발 적 인 일이 발생 하 는 지(예 를 들 어 갑 작 스 러 운 수요 가 바 뀌 는 것)를 잘 생각해 야 합 니 다.그러면 우리 자신 도 편리 하고 나중에 지 키 는 사람 도 편리 합 니 다.불필요 한 번 거 로 움 도 막 았 습 니 다.
여러분 의 인내심 있 는 읽 기 에 감 사 드 립 니 다.이것 은 대략적인 소개 일 뿐 이 므 로 부족 한 점 이 많 을 것 입 니 다.만약 에 여러분 이 건의 가 있 으 면 댓 글 교 류 를 환영 하고 여러분 들 이 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기