使用框架 element+vue
教程链接 https://www.bilibili.com/video/BV1cf4y1j7hL?p=439

项目创建与启动

项目创建

  1. 在需要的位置创文件夹,文件夹右键,进入vscode。
  2. 在终端中运行vue create 项目名称
  3. 选取配置,自定义,选择babel、router和使用配置文件,回车即可

配置element-ui

安装npm i element-ui -S
我按需引入的时候忘记配置,所以报下面的错
element-ui按需引入报错 Error: Cannot find module ‘babel-preset-es2015’

解决方法一

  1. npm install babel-plugin-component -D

然后,将\node_modules*babel-plugin-dynamic-import-node*.babelrc中的内容替换成官方文档中的内容

  1. {
  2. "presets": [["es2015", { "modules": false }]],
  3. "plugins": [
  4. [
  5. "component",
  6. {
  7. "libraryName": "element-ui",
  8. "styleLibraryName": "theme-chalk"
  9. }
  10. ]
  11. ]
  12. }

解决方法二

直接在 babel.config.js 中添加即可:

  1. module.exports = {
  2. presets: [
  3. '@vue/app'
  4. ],
  5. //以下是添加的内容
  6. plugins: [
  7. [
  8. "component",
  9. {
  10. "libraryName": "element-ui",
  11. "styleLibraryName": "theme-chalk"
  12. }
  13. ]
  14. ]
  15. //以上是添加内容
  16. }

终于启动了,然后路由又报错了
Cannot read property ‘matched’ of undefined”
原因在于引入element的时候,粘贴了如下代码,而这个里面的需要加router

  1. new Vue({
  2. el: '#app',
  3. render: h => h(App)
  4. });

因为默认的项目模板中有传值的案例,所以分析一下组件之间的传值,以下是示例页面。

父子组件之间传参

父组件中放了子组件的传参

app.vue是根组件,由这个组件定义哪个路径可以到哪个组件页面
屏幕快照 2021-08-25 上午11.37.46.png
这个方法适用于在父组件中放了一个子组件的例子,比如在home.vue中放了一个<HelloWorld/> <HelloWorld> 子组件

  1. app.vue根组件
  2. <template>
  3. <div id="app">
  4. <div id="nav">
  5. <router-link to="/">Home</router-link> //nav中的链接home到home组件
  6. <router-link to="/about">About</router-link> //about到about组件
  7. </div>
  8. <router-view/>
  9. </div>
  10. </template>
  1. home.vue父组件
  2. <template>
  3. <div class="home">
  4. <img alt="Vue logo" src="../assets/logo.png">
  5. <HelloWorld msg="Welcome to Your Vue.js App"/>
  6. //home组件中插入了一个子组件helloword,传递了一个msg
  7. </div>
  8. </template>
  9. <script>
  10. // @ is an alias to /src
  11. import HelloWorld from '@/components/HelloWorld.vue' //先导入子组件
  12. export default {
  13. name: 'Home',
  14. components: {
  15. HelloWorld //这里定义了子组件
  16. }
  17. }
  18. </script>
  1. helloworld.vue子组件
  2. <template>
  3. <div class="hello">
  4. <h1>{{ msg }}</h1>
  5. //然后就可以使用
  6. </div>
  7. </template>
  8. <script>
  9. export default {
  10. name: 'HelloWorld',
  11. props: {
  12. msg: String //子组件里面先在这里接收
  13. }
  14. }
  15. </script>

如何进行父子组件传参

父组件中

  1. //v-for循环的时候,定义了index
  2. <el-menu
  3. v-for="(item,index) in positionlist"
  4. :key='index'
  5. default-active="0"
  6. @select='choose'
  7. class="width">
  8. //所以只需要在点击的时候,把index传给函数,并在函数中将index保存到data中即可,这里定义为了selectedindex
  9. <el-menu-item>
  10. <span slot="title">
  11. <router-link to="/position" @click.native="logindex(index)">{{item.position}}</router-link>
  12. </span>
  13. </el-menu-item>
  14. </el-menu>
  15. //需要显示的地方,放上路由组件的router-link,然后通过index把需要显示的那个传过去即可。
  16. <el-col :span='18'>
  17. <router-view :positionlist='positionlist[selectedindex]'></router-view>
  18. </el-col>
  19. <script>
  20. export default {
  21. data(){
  22. return{
  23. selectedindex:0,
  24. }
  25. }
  26. }
  27. </script>

子组件中

  1. <div>
  2. <div class="joinuscontent">
  3. <h6>{{positionlist.dutytitle}}</h6>
  4. <p>{{positionlist.duty}}</p>
  5. <h6>{{positionlist.treatitle}}</h6>
  6. <p>{{positionlist.treatment}}</p>
  7. </div>
  8. <script>
  9. export default {
  10. props: {
  11. positionlist: {
  12. type: Object,
  13. required: true
  14. },
  15. },
  16. }
  17. </script>

this.$router.push()和路由跳转同时传递参数

原文链接 https://blog.csdn.net/weixin_45781661/article/details/102736141
  1. //传参的格式都是一样的
  2. {path: '/next',query: {title: this.tag,src: this.src}}
  3. //要跳转的下一个界面
  4. //用query传递参数,参数不会丢失,如果用params传参,参数会丢失
  5. //可以把对象写在data中,如何把名字绑定给路由即可
  6. //用this.$router.push()传参
  7. <script>
  8. go() {
  9. this.$router.push({
  10. path: '/next',//要跳转的下一个界面
  11. name: 'next',
  12. query: {//用query传递参数,参数不会丢失,如果用params传参,参数会丢失
  13. title: this.tag,
  14. src: this.src
  15. }
  16. })
  17. },
  18. </script>
  19. //用<router-link>传参
  20. <router-link :to="{path: '/next',query: {title: this.tag,src: this.src}}"></router-link>

动态路由

首先在router中的index.js中配置

  1. {
  2. path:'/solution/:index',
  3. name:'solution',
  4. component: () => import(/* webpackChunkName: "about" */ '../views/solution.vue')
  5. },
  6. //:冒号代表动态路由

然后可以在你需要添加动态路由的地方进行配置

  1. <div v-for='(item,index) in solutioncontent' :key='index' :id='item.id' class="nav-row">
  2. <img :src="item.iconPath" alt="" class="iconsize">
  3. <router-link :to="{path:'/solution/'+item.id,query:{slocont:solutioncontent[index]}}">{{item.title}}</router-link> //重要的是这一行
  4. </div>

获取路由的动态路径参数

  1. this.$route.params.id //id换成动态路径的名称

如何使用less

安装less,安装后需要重启项目

  1. //下载less和less-loader即可,lessloader版本过高可能报错
  2. //安装less
  3. npm i less --save-dev
  4. //安装less-loader 版本太高则可以指定版本
  5. npm install less-loader@4.1.0 --save

卸载less

  1. npm uninstall less
  2. npm uninstall less-loader

使用bootstrap框架

引入一下他的样式

  1. <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
  2. <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
  3. <!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
  4. <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap-theme.min.css" integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous">
  5. <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
  6. <script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>

项目文件夹中使用npm安装一下,就可以使用bootstrap的组件了。

npm install bootstrap@3

button的五种状态

a:link{color:#fff}  //未访问时的状态(鼠标点击前显示的状态)
a:hover{color:#fff}  //鼠标悬停时的状态
a:visited{color:#fff}  //已访问过的状态(鼠标点击后的状态)
a:active{color:#fff}  //鼠标点击时的状态
a:focus{color:#fff}  //点击后鼠标移开保持鼠标点击时的状态[获得焦点](只有在<a href="#"></a>时标签中有效)

轮播图按照不同尺寸改变高度

教程原链接 https://blog.csdn.net/qq_47452289/article/details/112461808

1.在data中定义一个值记录屏幕尺寸

data(){
    return{
         screenWidth: null,  //屏幕尺寸
    }
}

2.页面获取屏幕尺寸的值

mounted () {
    this.screenWidth = document.body.clientWidth
    window.onresize = () => {   //屏幕尺寸变化就重新赋值
      return (() => {
        this.screenWidth = document.body.clientWidth
      })()
    }
  }

3.如果要根据屏幕尺寸大小做操作的时候就用watch监听

watch: {
    screenWidth: {
      handler: function (val, oldVal) {
        if (val < 1550) {
          console.log('屏幕宽度小于1550px')
        } else {
          console.log('屏幕宽度大于1550px')
        }
      },
      immediate: true
    },
  }

导航栏滚动到一定高度加上白色背景色

教程原链接 https://blog.csdn.net/qq_41115965/article/details/80085942

    $(function() {
        $(".nav2").hide();  //首先隐藏变异的导航栏
        $(window).scroll(function() {
            if($(document).scrollTop() >= 200) {
                $(".nav2").addClass("fixnav").slideDown(); 
        //高度大于200 则添加样式, slideDown() 方法通过使用滑动效果,显示隐藏的被选元素。
            } else {
                $(".nav2").hide();
            }
        })
    })

因为我的导航栏布局都一样,只是过一定高度需要加个白色背景色及阴影。稍微修改一下,通过添加和去除class来操控。

    $(function() {
        $(window).scroll(function() {
            if($(document).scrollTop() >= 766) {
          $(".nav").addClass("navafter");
            }
      else {
                $(".nav").removeClass("navafter");
            }
        })
    })

补充知识:如何获取当前高度

获取浏览器显示区域(可视区域)的高度 :   
$(window).height();   
获取浏览器显示区域(可视区域)的宽度 :
$(window).width();   
获取页面的文档高度   
$(document).height();   
获取页面的文档宽度 :
$(document).width(); 
浏览器当前窗口文档body的高度:  
$(document.body).height();
浏览器当前窗口文档body的宽度: 
$(document.body).width();
获取滚动条到顶部的垂直高度 (即网页被卷上去的高度)  
$(document).scrollTop();   
获取滚动条到左边的垂直宽度 :
$(document).scrollLeft(); 
获取或设置元素的宽度:
$(obj).width();
获取或设置元素的高度:
$(obj).height();
某个元素的上边界到body最顶部的距离:obj.offset().top;(在元素的包含元素不含滚动条的情况下)
某个元素的左边界到body最左边的距离:obj.offset().left;(在元素的包含元素不含滚动条的情况下)
返回当前元素的上边界到它的包含元素的上边界的偏移量:obj.offset().top(在元素的包含元素含滚动条的情况下)
返回当前元素的左边界到它的包含元素的左边界的偏移量:obj.offset().left(在元素的包含元素含滚动条的情况下)
//滚动时触发函数
$(window).scroll(function () {})

vue $watch监听属性之 监听函数 handler() 以及 immediate:true立即执行

  watch:{
    // 轮播图高度的自适应
    screenWidth: {
      handler: function (val, oldVal) {
        if (val < 769) {
          this.bannerheight='315px'

        } else if(val < 993){
          this.bannerheight='419px'

        } else if(val < 1201){
          this.bannerheight= '542px'

        }else if(val < 1441){
          this.bannerheight= '766px'

        }else{
          this.bannerheight= '1020px'

        }
        // console.log(this.bannerheight);
      },

      immediate: true
    },
    // 滚动的时候,获取当前的高度
    // 如果高度超过轮播图高度,则把样式切换
  },

在接收到到数据中进行换行

原文链接 https://www.cnblogs.com/leegent/p/9274424.html

最后用的是css的方法,后台传过来的数据一般有默认的/n换行符,如果是从父组件传过来的,那么需要在每个换行的地方手动加上\n

  <div class="joinuscontent">
    <h6>{{positionlist.dutytitle}}</h6>
    <p>{{positionlist.duty}}</p>
    <h6>{{positionlist.treatitle}}</h6>
    <p>{{positionlist.treatment}}</p>

</div>

<style>
.joinuscontent{
    padding: 40px;
    white-space: pre-wrap;
}
</style>

js的方法,但是没有成功

<script>
export default {
    created(){
        this.addbr()
    },
    methods:{
        // 添加换行符,这里的意思把\n通过全局搜索(/g),全部转换为"<br/>"
        addbr(){
            this.positionlist.duty.replace(/\n/g, "<br/>")
        }
    }
}
</script>

如何修改element默认样式

方法一

//改不了只能在需要改样式的地方用!important覆盖掉

方法二

原文链接 https://www.cnblogs.com/my466879168/p/12091439.html
使用样式穿透,在控制台里面找到元素的默认样式,复制到代码中,在中间加上/deep/即可
<style scoped>
    .my .el-input__inner{
        border-radius: 30px;/* 这个不起作用 */
    }
    .my /deep/ .el-input__inner{
        border-radius: 30px;/* 这个起作用 */
    }
</style>

vue中使用本地json

原文链接 https://blog.csdn.net/hdsHDS6/article/details/106336707
import导入即可

//示例
<script>
import jsondata from '../../public/data.json'
//注意如果json中使用静态资源,比如本地图片路径,如果vue-cli版本高于3.0,则需要把资源放到public文件夹中,如果低于3.0,则需要把资源放到static文件夹中。

data(){
    return{
    customers:[] //这个就可以用了
}
}

created(){
this.customers=jsondata.customers
console.log(this.customers);
},
 </script>

循环生成的列表中使用多选框