• html5里引用vue.js,实现自定义组件,子父组件相互传参


    在html里直接引用vue.js,实现自定义组件、子父相互传参

    目录

    自定义组件

     父组件给子组件传值

    子组件向父组件传值

    vue3组件用法


    自定义组件

    目录结构

    一、首先,引用vue.js到页面,版本根据自己的需要,我这里是2点多的版本

    <script src="https://unpkg.com/vue@2.7.14/dist/vue.js">script>

    二、创建页面index.html

    1. <body>
    2. <div id="app">
    3. <my-load>my-load>
    4. div>
    5. body>

    三、编写组件内容

    新建一个js文件,内容如下,我这里文件名是 my_component.js

    1. //只渲染静态的
    2. // let str = `
    3. //
    4. //
    5. //
  • // `
  • // let myComponent = Vue.extend({
  • // template:str ,
  • // })
  • //或者动态在data中返回
  • let str = `
  • {{childrenTxt}}

  • `
  • let myComponent = Vue.extend({
  • template:str ,
  • data:function(){
  • return {
  • childrenTxt:'我是子组件的值哦'
  • }
  • }
  • })
  • Vue.component('my-load',myComponent )
  • 四、引用组件

    在刚刚创建的index.html文件中引用刚刚创建组件文件my_component.js

    1. <script>
    2. new Vue({
    3. el:'#app',
    4. data:{},
    5. mounted(){},
    6. methods:{},
    7. })
    8. script>

    这时候看页面组件的结构已经渲染到页面了,效果如下

     父组件给子组件传值

    一、父组件也就是index.html准备数据 ,传给子组件也就是my_component.js

    注意:组件传值的名字不可以大写,要小写

    例如:father_data 就通过它传给子组件,子组件就是通过father_data来接收,testTxt是要传的值 ,father_data 不能有大写字母,否则值传不过去

    1. <body>
    2. <div id="app">
    3. <my-load :father_data="testTxt">my-load>
    4. div>
    5. body>
    1. <script>
    2. new Vue({
    3. el:'#app',
    4. data:{
    5. testTxt:'今天是周末啊',
    6. },
    7. mounted(){},
    8. methods:{},
    9. })
    10. script>

    二、子组件my_component.js接收值

    1. let str = `
    2. {{childrenTxt}}

    3. 这是父组件传过来的哦:{{father_data}}

  • `
  • let myComponent = Vue.extend({
  • template:str,
  • props:['father_data'],//接收父组件传的值
  • data:function(){
  • return {
  • childrenTxt:'我是子组件的值哦'
  • }
  • }
  • })
  • Vue.component('my-load',myComponent )
  • 最后渲染的页面效果如下:

    子组件向父组件传值

    一、子组件my_component.js 准备数据和传值给父组件index.html

    1. let str = `
    2. {{childrenTxt}}

    3. 这是父组件传过来的哦:{{father_data}}

  • `
  • let myComponent = Vue.extend({
  • template:str,
  • props:['father_data'],
  • data:function(){
  • return {
  • childrenTxt:'我是子组件的值哦',
  • childrenData:'放假啦'
  • }
  • },
  • methods:{
  • clickFun(){//当点击这个p标签的时候把值传给父组件
  • this.$emit('childfun',this.childrenData)
  • }
  • },
  • })
  • Vue.component('my-load',myComponent )
  • 二、父组件index.html接收子组件的值

    1. <body>
    2. <div id="app">
    3. <my-load :father_data="testTxt" @childfun="childfun">my-load>
    4. <p>{{childtext}}p>
    5. div>
    6. body>
    1. <script>
    2. new Vue({
    3. el:'#app',
    4. data:{
    5. testTxt:'今天是周末啊',
    6. childtext:'',//用来存接收子组件的值
    7. },
    8. mounted(){},
    9. methods:{
    10. childfun(val){
    11. console.log('val',val)
    12. this.childtext = val
    13. },
    14. },
    15. })
    16. script>

    最后渲染的效果如下:

    以上是vue写法,以下为vue3写法

    vue3组件用法

    自定义一个简单的header头部引入index

    1、新建index.html 、同级新建目录 components ,该目录下新建组件header.js

    2、组件header.js添加内容 

    1. /**
    2. **props 接收index传递过来的值header_data 和 li_current
    3. **header_data 是index页面 传递给 header组件的导航数据
    4. **menuClick 点击方法, menuitem 传递给index的点击方法,并把值index传递过去
    5. */
    6. export default {
    7. data() {
    8. return {};
    9. },
    10. methods:{
    11. menuClick(index){
    12. this.$emit('menuitem',index)
    13. }
    14. },
    15. props:["header_data","li_current"],
    16. template:`
      • {{item.name}}
      • `,
      • };

      2、index页面引用

      1. <top-header :header_data="headerdata" :li_current="liCurrent" @menuitem="menuitem">top-header>
      1. const headerdata = ref([])//定义导航数据类型
      2. const liCurrent = ref(0)//当前导航下标
      3. headerdata.value = [{id:0,name:'首页'},{id:0,name:'列表'},{id:0,name:'详情'},{id:0,name:'其他'},]
      4. //点击导航改变当前index,传给组件header
      5. const menuitem = (index) => {
      6. console.log(index)
      7. liCurrent.value = index
      8. }

      注意:

      html中默认不能使用module形式,即不能用import导入文件,会报如下图错误

      解决办法:在script标签上加上type=module属性来改变方式

      踩坑:注册组件名字 header 、Header 无效,需要换其他的名字

       到此完成vue3在html里的组件应用,效果如下:

       最后附vue3组件的完整代码示例:

      index.html

      1. html>
      2. <html>
      3. <head>
      4. <meta charset="UTF-8">
      5. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
      6. <style>
      7. *{padding:0;margin:0;border:0}
      8. .header-sty{height:50px;border-bottom: 2px solid;width: 100%;line-height: 50px;}
      9. .header-sty li{list-style: none;;float: left;margin-right: 20px;font-size: 14px;cursor: pointer;}
      10. .header-sty li.cur{font-weight: bold;color:red}
      11. style>
      12. <title>title>
      13. head>
      14. <body>
      15. <div id="app" >
      16. <top-header :header_data="headerdata" :li_current="liCurrent" @menuitem="menuitem">top-header>
      17. div>
      18. body>
      19. html>
      1. <script type="module" >
      2. const { createApp, reactive, toRefs, ref, watch, onMounted ,onBeforeMount} = Vue;
      3. import Header from './components/header.js'
      4. const app = createApp({
      5. setup() {
      6. const headerdata = ref([])//定义导航数据类型
      7. const liCurrent = ref(0)//当前导航下标
      8. onMounted(() => {
      9. headerdata.value = [{id:0,name:'首页'},{id:0,name:'列表'},{id:0,name:'详情'},{id:0,name:'其他'},]
      10. console.log(headerdata.value)
      11. })
      12. //点击导航改变当前index,传给组件header
      13. const menuitem = (index) => {
      14. console.log(index)
      15. liCurrent.value = index
      16. }
      17. return{
      18. headerdata,
      19. menuitem,
      20. liCurrent
      21. }
      22. },
      23. })
      24. app.component('top-header', Header);
      25. app.mount("#app");
      26. script>

      header.js

      1. // header component
      2. export default {
      3. data() {
      4. return {};
      5. },
      6. methods:{
      7. menuClick(index){
      8. this.$emit('menuitem',index)
      9. }
      10. },
      11. props:["header_data","li_current"],
      12. template:`
        • {{item.name}}
        • `,
        • };
      13. 相关阅读:
        B站短视频竟涨900w播放,B站UP主不可忽视的流量蓝海!
        如何修改 GUI 默认 shader 实现自定义 UI 表现
        以太坊合并后的节点同步及共识层同步加速(geth+prysum)
        nginx反向代理及负载均衡
        cocos游戏引擎制作的滚动框地图防止误点操作的简单方法
        vue生命周期详解
        Windows系统CMake+VS编译protobuf
        ASCII码转HEX与HEX转ASCII码
        MySQL实现每日备份
        python自学入门(打卡十)2022-11-22
      14. 原文地址:https://blog.csdn.net/qq_39109182/article/details/127821485