好吧所以我有多个问题,(或多或少基本的)
第一个问题:当我执行类似
的操作时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更改为红色,当我再次点击它时,它会恢复为绿色颜色 这是我的 togglePersonHandler ,它会在点击按钮时更改If条件的状态(showPerson)
20
我的第三个问题是,当我再次点击它时,为什么它会自动更改为原始颜色(绿色)?我通常习惯用其他条件
来做答案 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;它重新呈现初始样式,因此它显示绿色。