组件传值&数据请求

每个组件 的作用域都是独立的, 有时候需要在组件之间完成数据的传递,需要通过组件传值的方式来实现

组件传值可以分为以下三类

父组件向子组件传递数据
子组件向父组件传递数据
非父子组件之间的数据传递

父传子 – 简化版

函数式组件传值

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8" />
        <title>Hello World</title>
        <!--react的核心库-->
        <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>

        <!--react的与dom相关的一些功能-->
        <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>

        <!--将浏览器不支持的jsx语法转化为js语法-->
        <script crossorigin src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
    </head>

    <body>
        <div id="root" class="parent">
            
        </div>
        

        
    </body>

</html>
<script type="text/babel">

    // 创建一个函数组件  ---- 使用props完成值得接收
    function Child(props){
        return (
            <div>
                <ul>
                    <li>{props.name}</li>
                    <li>2</li>
                    <li>3</li>
                </ul>
            </div>
        )
    }


    ReactDOM.render(
        // 渲染组件  并通过name属性完成传值
        <Child name="3"></Child>, 
        document.getElementById('root') 
    );

</script>

类组件传值

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    </body>
</html>
<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8" />
        <title>Hello World</title>
        <!--react的核心库-->
        <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>

        <!--react的与dom相关的一些功能-->
        <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>

        <!--将浏览器不支持的jsx语法转化为js语法-->
        <script crossorigin src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
    </head>

    <body>
        <div id="root"></div>
        

        
    </body>

</html>
<script type="text/babel">

    // 创建一个类组件
    class Child extends React.Component{
        render(){
            return (
                <div>
                    <ul>
                        <li>{this.props.name}</li>
                        <li>2</li>
                        <li>3</li>
                    </ul>
                </div>
            )
        }
    }


    ReactDOM.render(
        <Child name="1"></Child>, 
        document.getElementById('root') 
    );

</script>

父传子 – 完整版

函数式组件

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8" />
        <title>Hello World</title>
        <!--react的核心库-->
        <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>

        <!--react的与dom相关的一些功能-->
        <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>

        <!--将浏览器不支持的jsx语法转化为js语法-->
        <script crossorigin src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
    </head>

    <body>
        <div id="root"></div>
        

        
    </body>

</html>
<!--
    
    组件:组成的部件,可以接受任何props输入,并返回元素
    
-->
<script type="text/babel">

    // 创建一个父组件 
    function Parent(){
        return (
            <div>
                <h1>这是父组件</h1>
                {/*在父组件中嵌套子组件*/}
                <Child name="1"></Child>
            </div>
        )
    }
    
    // 创建一个子组件 列表
    function Child(props){
        return (
            <div>
                <h3>这是子组件</h3>
                <ul>
                    <li>{props.name}</li>
                    <li>2</li>
                    <li>3</li>
                </ul>
            </div>
        )
    }

    // 2. 组件的使用
    ReactDOM.render(
        <Parent></Parent>, 
        document.getElementById('root') 
    );

</script>

类组件

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    </body>
</html>
<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8" />
        <title>Hello World</title>
        <!--react的核心库-->
        <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>

        <!--react的与dom相关的一些功能-->
        <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>

        <!--将浏览器不支持的jsx语法转化为js语法-->
        <script crossorigin src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
    </head>

    <body>
        <div id="root"></div>
        

        
    </body>

</html>
<script type="text/babel">

    // 创建一个类组件  -- 父
    class Parent extends React.Component{
        render(){
            return (
                <div>
                    <h1>这是父组件</h1>
                    {/*在父组件中嵌套子组件*/}
                    <Child name="1"></Child>
                </div>
            )
        }
    }

    
    // 创建一个类组件  -- 子
    class Child extends React.Component{
        render(){
            return (
                <div>
                    <h3>这是子组件</h3>
                    <ul>
                        <li>{this.props.name}</li>
                        <li>2</li>
                        <li>3</li>
                    </ul>
                </div>
            )
        }
    }
    


    ReactDOM.render(
        <Parent></Parent>, 
        document.getElementById('root') 
    );

</script>

子传父

函数式组件

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8" />
        <title>Hello World</title>
        <!--react的核心库-->
        <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>

        <!--react的与dom相关的一些功能-->
        <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>

        <!--将浏览器不支持的jsx语法转化为js语法-->
        <script crossorigin src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
    </head>

    <body>
        <div id="root"></div>
    </body>

</html>
<script type="text/babel">

    //子组件
    function Child(props){
            return (
                <div>
                    {/*当文本框内容发生变化的时候.会执行父组件里面的事件*/}
                     子组件:<input onChange={props.handleEmail}/>
                </div>
           )
    }
    
    //父组件
    function Parent() {
        
        return (
            <div>
                <div id='div'>父组件:{1}</div>
                <Child name="email" handleEmail={
                    function (event){
                        /*获取子组件的数据*/
                        console.log(event.target.value)
                        
                        document.getElementById('div') = event.target.value
                        
                    }
                }/>
            </div>
        )
    }
    
    ReactDOM.render(
      <Parent />,
      document.getElementById('root')
    );

</script>

类组件

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8" />
        <title>Hello World</title>
        <!--react的核心库-->
        <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>

        <!--react的与dom相关的一些功能-->
        <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>

        <!--将浏览器不支持的jsx语法转化为js语法-->
        <script crossorigin src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
    </head>

    <body>
        <div id="root"></div>
    </body>

</html>
<script type="text/babel">

    //子组件
    class Child extends React.Component{

        render(){
            return (
                <div>
                    {/*当文本框内容发生变化的时候.会执行父组件里面的事件*/}
                     子组件:<input onChange={this.props.handleEmail}/>
                </div>
            )
        }
    }
    
    //父组件
    class Parent extends React.Component{

        constructor(props){
            super(props)
            this.state = {
                email:''
            }
        }
        handleEmail(event){
            this.setState({email: event.target.value});
        }
        
        
        
        render(){
            return (
                <div>
                    <div>父组件:{this.state.email}</div>
                    <Child name="email" handleEmail={this.handleEmail.bind(this)}/>
                </div>
            )
        }
    }
    
    ReactDOM.render(
      <Parent />,
      document.getElementById('root')
    );

</script>

非父子

非父子组件传值之兄弟组件传值

使用中间人模式 , 定义一个公共的父组件来实现兄弟组件之间的数据传递

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8" />
        <title>Hello World</title>
        <!--react的核心库-->
        <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>

        <!--react的与dom相关的一些功能-->
        <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>

        <!--将浏览器不支持的jsx语法转化为js语法-->
        <script crossorigin src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
    </head>

    <body>
        <div id="root"></div>
        

    </body>

</html>
<script type="text/babel">
    
    
    class Brother1 extends React.Component{
      constructor(props){
        super(props);
        this.state = {}
      }
      
      render(){
        return (
          <div>
            <button onClick={this.props.refresh}>
                更新兄弟组件
            </button>
          </div>
        )
      }
    }
    
    class Brother2 extends React.Component{
      constructor(props){
        super(props);
        this.state = {}
      }
      
      render(){
        return (
          <div>
             {this.props.text || "兄弟组件未更新"}
          </div>
        )
      }
    }
    
    class Parent extends React.Component{
      constructor(props){
        super(props);
        this.state = {}
      }
      
      refresh(){
        return (e)=>{
          this.setState({
            text: "兄弟组件沟通成功",
          })
        }
      }
      
      render(){
        return (
          <div>
            <h2>兄弟组件沟通</h2>
            <Brother1 refresh={this.refresh()}/>
            <Brother2 text={this.state.text}/>
          </div>
        )
      }
    }

    ReactDOM.render(<Parent />, document.getElementById('root'));

</script>

组件的嵌套

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8" />
        <title>Hello World</title>
        <!--react的核心库-->
        <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>

        <!--react的与dom相关的一些功能-->
        <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>

        <!--将浏览器不支持的jsx语法转化为js语法-->
        <script crossorigin src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
    </head>

    <body>
        <div id="root"></div>
        
        
    </body>

</html>
<!--
    
    组件:组成的部件,可以接受任何props输入,并返回元素
    
-->
<script type="text/babel">

    // 1.1 创建一个基本的组件
    function Welcome(props){
        return (
            <div>
                <p>{props.name}</p>
            </div>
        )
    }
    
    
    // 1.2 创建一个app组件,并使用Welcome组件
    function App(props){
        return (
            <div>
                <Welcome name="1"></Welcome>
                <Welcome name="2"></Welcome>
                <Welcome name="3"></Welcome>
            </div>
        )
    }

    var element = <App></App>
    // 2. 组件的使用
    ReactDOM.render(
        element, 
        document.getElementById('root') 
    );

</script>

props总结

props是只读的

所有 React 组件都必须是纯函数,并禁止修改其自身 props 。

get请求

数据请求

静态数据

最初的时候, 渲染页面 , 数据都是写在本页面

这样操作的问题是修改页面内容不方便, 只能通过操作本页面完成

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8" />
        <title>Hello World</title>
        <!--react的核心库-->
        <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>

        <!--react的与dom相关的一些功能-->
        <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>

        <!--将浏览器不支持的jsx语法转化为js语法-->
        <script crossorigin src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
        
        <!--数据请求-->
        <script src="https://cdn.bootcss.com/fetch/2.0.3/fetch.min.js"></script>
    </head>

    <body>
        <div id="root"></div>

    </body>

</html>
<script type="text/babel">
    

    
    class Fetch_get extends React.Component{
        
        constructor(props){
            super(props)
            this.state = {
                arr:[
                    {"id":"123001","name":"xiaoming"},
                    {"id":"123002","name":"xiaobing"},
                    {"id":"123003","name":"xiaona"}
                ]
            }
        }
        
        render(){
            return (
                <div>
                    <ul>
                        {
                            this.state.arr.map((ele,index,arr)=>{
                                return <li key={index}>{ele.name}</li>
                            })
                        }
                    </ul>
                </div>
            )
        }
        
    }
    
    
    

    ReactDOM.render(
        <Fetch_get></Fetch_get>, 
        document.getElementById('root') 
    );

</script>

请求json文件,完成页面的渲染

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8" />
        <title>Hello World</title>
        <!--react的核心库-->
        <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>

        <!--react的与dom相关的一些功能-->
        <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>

        <!--将浏览器不支持的jsx语法转化为js语法-->
        <script crossorigin src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
        
        <!--数据请求-->
        <script src="https://cdn.bootcss.com/fetch/2.0.3/fetch.min.js"></script>
    </head>

    <body>
        <div id="root"></div>

    </body>

</html>
<script type="text/babel">
    

    
    class Fetch_get extends React.Component{
        
        constructor(props){
            super(props)
            this.state = {
                arr:[]
            }
        }
        
        render(){
            return (
                <div>
                    <ul>
                        {
                            this.state.arr.map((ele,index,arr)=>{
                                return <li key={index}>{ele.name}</li>
                            })
                        }
                    </ul>
                </div>
            )
        }
        
        componentDidMount(){
            
            var url = "data.json"
            
            var option = {
                methods:"get"
            }
            
            fetch(url,option).then((res)=>{
                return res.json()
            }).then((res)=>{
                // 请求到的数据
                console.log(res)
                
                // 修改state
                this.setState({
                    arr:res
                })
                
                // 打印输出 
                console.log(this.state.arr)
                
            })
            
        }
        
    }
    
    
    

    ReactDOM.render(
        <Fetch_get></Fetch_get>, 
        document.getElementById('root') 
    );

</script>

在线接口

书写数据接口, 通过后台操作, 读取数据库数据, 并做成接口的形式, 我们需要对数据进行操作的时候,直接操作接口即可

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8" />
        <title>Hello World</title>
        <!--react的核心库-->
        <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>

        <!--react的与dom相关的一些功能-->
        <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>

        <!--将浏览器不支持的jsx语法转化为js语法-->
        <script crossorigin src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
        
        <!--数据请求-->
        <script src="https://cdn.bootcss.com/fetch/2.0.3/fetch.min.js"></script>
    </head>

    <body>
        <div id="root"></div>

    </body>

</html>
<script type="text/babel">
    
    [{"id":"123001","name":"xiaoming"},{"id":"123002","name":"xiaobing"},{"id":"123003","name":"xiaona"}]
    
    class Fetch_get extends React.Component{
        
        constructor(props){
            super(props)
            this.state = {
                arr:[]
            }
        }
        
        render(){
            return (
                <div>
                    <ul>
                        {
                            this.state.arr.map((ele,index,arr)=>{
                                return <li key={index}>{ele.name}</li>
                            })
                        }
                    </ul>
                </div>
            )
        }
        
        componentDidMount(){
            
            var url = "http://www.taoquan.store/robot/getUsers.php"
            
            var option = {
                methods:"get"
            }
            
            fetch(url,option).then((res)=>{
                return res.json()
            }).then((res)=>{
                // 请求到的数据
                console.log(res.users)
                
                // 修改state
                this.setState({
                    arr:res.users
                })
                
                // 打印输出 
                console.log(this.state.arr)
                
            })
            
        }
        
    }

    ReactDOM.render(
        <Fetch_get></Fetch_get>, 
        document.getElementById('root') 
    );

</script>

文件上传

  • Content-Type:上传文件的时候,一定要设置为application/x-www-form-urlencoded

跨域

fetch跨域概述

在fetch的配置中有 mode选项 , 提供了跨域的能力

  • mode: ‘cors’, // no-cors, cors, *same-origin

  • mode:’cors’

    • 这个选项提供了跨域的能力, 但是服务端必须支持 cors ,也就是设置 res.header(“Access-Control-Allow-Origin”, “*”);
  • mode:’no-cors’

    • 可以跨域进行数据请求 , 不需要设置跨域 header
    • 在该模式下 得到的返回数据中 type为opaque。, 能够在控制台看到返回的数据, 但是没有权限使用这些数据
  • mode:”same-origin”

    • 同源, 不允许跨域

并不能成功跨域进行数据的访问

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8" />
        <title>Hello World</title>
        <!--react的核心库-->
        <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>

        <!--react的与dom相关的一些功能-->
        <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>

        <!--将浏览器不支持的jsx语法转化为js语法-->
        <script crossorigin src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
        
        <!--数据请求-->
        <script src="https://cdn.bootcss.com/fetch/2.0.3/fetch.min.js"></script>
    </head>

    <body>
        <div id="root"></div>

    </body>

</html>
<script type="text/babel">
    
    
    class Fetch_get extends React.Component{
        
        constructor(props){
            super(props)
            this.state = {
                arr:[]
            }
        }
        
        render(){
            return (
                <div>
                    <ul>
                        {
                            this.state.arr.map((ele,index,arr)=>{
                                return <li key={index}>{ele.name}</li>
                            })
                        }
                    </ul>
                </div>
            )
        }
        
        componentDidMount(){
            
             var url = "https://api.douban.com/v2/movie/top250"
            // var url = 'http://127.0.0.1:8899/api/selectData'
            var option = {
                methods:"get",
                mode:'no-cors'
            }
            
            fetch(url,option).then((res)=>{
                console.log(res)
            })
            
        }
        
    }
    
    
    

    ReactDOM.render(
        <Fetch_get></Fetch_get>, 
        document.getElementById('root') 
    );

</script>

关于跨域的三种方式

第一种方式

利用script标签的跨域访问特性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JSONP实现跨域2</title>
</head>
<body>
</body>

</html>
<!--代码的先后顺序 不能变-->
<script type="text/javascript">
    function fn(response){
            console.log(response);
    }
</script>
<script src="https://api.douban.com/v2/movie/top250?callback=fn"></script>

第二种方式

动态创建script标签

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JSONP实现跨域2</title>
</head>
<body>
</body>

</html>
<!--代码的先后顺序 不能变-->
<script type="text/javascript">
    function fn(response){
            console.log(response);
    }
    
    var script = document.createElement('script')
    
    script.src = 'https://api.douban.com/v2/movie/top250?callback=fn'
    
    document.body.insertBefore(script, document.body.firstChild);   
    
</script>

第三种方式

使用jquery

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    </body>
</html>
<script src="https://code.jquery.com/jquery.js"></script>
<script type="text/javascript">
    
    
    $.ajax({
        type:'get',
        url:"https://api.douban.com/v2/movie/top250?callback=?",
        success(res){
            console.log(res)
        },
        dataType:"jsonp"
    })
    
    
</script>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 226,488评论 6 524
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 97,466评论 3 411
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 174,084评论 0 371
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,024评论 1 305
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,882评论 6 405
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,395评论 1 318
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,539评论 3 433
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 41,670评论 0 282
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,194评论 1 329
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,173评论 3 352
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,302评论 1 362
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,872评论 5 354
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,581评论 3 342
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,984评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,179评论 1 278
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,888评论 3 385
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,306评论 2 369

推荐阅读更多精彩内容