反应:编译失败

时间:2018-04-12 22:47:17

标签: javascript reactjs

好吧所以我有多个问题,(或多或少基本的)

第一个问题:当我执行类似

的操作时
var users:[UserInfo] = []
var number:Int = 0
let dispatch:DispatchSemaphore = DispatchSemaphore(value: 0)


override func viewDidLoad() {

    tableView.delegate = self
    tableView.dataSource = self

    // GET the data from the stackexchange api

    let param: Parameters = [
        "order": "desc",
        "max" : 10,
        "sort" : "reputation",
        "site" : "stackoverflow"
    ]

    Alamofire.request("https://api.stackexchange.com/2.2/users", method: .get, parameters: param).responseJSON { (response) -> (Void) in


        if let json = response.result.value {
            // we got a result

            /* I know this is a bit ugly */
            let json1 = json as! [String:AnyObject]
            let usersInfoFromJSON = json1["items"] as! NSArray       // remember to cast it as NSDictionary


            for userInfo in usersInfoFromJSON {

                self.number = 70 // just for test

                let userDict = userInfo as! NSDictionary
                self.users.append(UserInfo(newName: userDict["display_name"] as! String,
                       newImageURL: userDict["profile_image"] as! String))
            }
        }
        self.dispatch.signal()
    }
    self.dispatch.wait()


    print(self.number) // just for test

    super.viewDidLoad()
}

在渲染之前,它会抛出一个错误,指出编译器Private Sub Worksheet_Change(ByVal Target As Range) Dim Rng As Range Dim Policies As String Dim Tbl As ListObject Set Tbl = Me.Range("PolTable").ListObject If Not Intersect(Target, Me.Range("D5")) Is Nothing Then If Target.Value <> "" Then For Each Rng In Tbl.ListColumns("Client ID").DataBodyRange If Rng = Target Then If Policies = "" Then Policies = Rng.Offset(0, 1).Value Else Policies = Policies & ", " & Rng.Offset(0, 1).Value End If End If Next Target.Offset(0, 1).Value = Policies End If End If End Sub 失败,但如果我在像class App extends Component { state = { person: [ {id: "name1n", name: "Rohit", age: 24}, {id: "name2l", name: "Hariom", age: 23}, {id: "name3g", name: "Vaibhav", age: 58} ], someOtherState: "Untouched state", showPerson: false } var apple = 10; 这样的渲染中做同样的事情,它就不会抛出错误。有人可以解释原因吗?

第二个问题在渲染中,当我做这样的事情时

var apple

在显示render( var apple = 10; );之前,它会在控制台中记录 render() { const style = { width: '150px', margin: 'auto', color: 'white', padding: '5px', backgroundColor: 'green', marginBottom: '10px' }; var apple = 10; console.log(apple) // -> This log let person = null; if (this.state.showPerson) { person= ( <div> { this.state.person.map((el, index) => { return <Person key={el.id} click={this.deletePersonHandler.bind(index)} name={el.name} age={el.age} changed={(event) => this.eventSwitchHandler(event, el.id)} /> }) } </div> ); style.backgroundColor = 'red' apple = 20; console.log(apple) // -> This log } return ( <div className="App"> <h1> Hi I am react App</h1> <button style={style} onClick={this.togglerPersonHandler}>Button</button> {person} </div> ) } } 两次,问题是为什么在显示20之前显示 10 ?不应该只是console.log - &gt; 10然后20?而不是10 - &gt; 10 - &gt; 20?

第三个问题当我点击按钮时,它会将 BackgroundColor更改为红色,当我再次点击它时,它会恢复为绿色颜色 这是我的 togglePersonH​​andler ,它会在点击按钮时更改If条件的状态(showPerson)

20

我的第三个问题是,当我再次点击它时,为什么它会自动更改为原始颜色(绿色)?我通常习惯用其他条件

来做

2 个答案:

答案 0 :(得分:2)

您的第一个示例无法编译,因为您无法在class范围内声明变量。您只能声明该类的属性:

class Foo {
    aProperty = "Foo";

    static aStaticProperty = 42;

    aFunction() {
         console.log("I am a function");
    }

    static aStaticFunction() {
        console.log("I am a static function");
    }   
}

render()只是一个必须在每个反应组件类中声明的函数。

您的第二个示例可能会显示该行为,因为每次状态或props更改时,组件都会调用其render()函数。因此,在第一次渲染时this.state.showPerson可能是false,因此您的第二个console.log()将不会被调用(因为它在条件块中)。第二次调用它this.state.showPerson已更改为true,因此两个console.log()都会被执行。

答案 1 :(得分:1)

在单个线程中提出单个问题总是更好的做法(帮助其他人有同样的问题进行阅读和导航)

第一个问题解答

你在一个类中声明一个变量,这是不允许的,虽然你可以在类中做这样的事情

apple = 10 

然后制作方法

    printMyname = () => {
    console.log(this.apple)
}

然后通过做类似的事情将其称为在课堂外

const app1 = new App ()
app1.printMyname()

在方法中,您可以声明var apple = 10(或者您可以全局声明它)并在方法

中调用它

第二个问题和第三个问题

这是因为事件的状态很可能在呈现时发生了变化。

所以这就是它实际工作的方式。

首次呈现网页时, 10 。 最初你的州是假的,所以它不会打印20 当州改变它时,再次登录 10再次<20> 下次状态发生变化时,它将再次控制台日志10和20

因此您的日志应该显示为 10,10,20,10,20,10 ....

同样适用于背景变化

state.changed(false) - &gt;它重新呈现初始样式,因此它显示绿色。